LINUX.ORG.RU

qt'ешные потоки и события over and over

 , , , ,


0

2

Доброго вечера. Наткнулся тут на статьи «вы делаете это не правильно». Интересно. Только осталось пара не понятных моментов. В общем: 1. Если я хочу чтобы один класс выполнялся в своем потоке могу ли я его переносить туда в контструкторе? Что-то на подобии этого:

SuperClass::SuperClass() {
  QThread *thread = new QThread();
  this->moveToThread(thread);
  thread->start();  
  QObject::connect(thread, SIGNAL(started()), this, SLOT(start()));
}
2. Есть у меня в классе структура, переменная etc которую могут менять в разных потоках. Можно ли в таком случае использовать слоты/сигналы без мютекса? Как-то так:
void SuperClass::changeStruct(int newValue) {
  // вызываем сигнал класса SuperClass
  emit changeValue(newValue);
}

void SuperClass::changeStructSlot(int newValue) {
  // Слот класса SuperClass который будет обрабатываться в своем потоке
  this._struct.val = newValue;
}
Оправданны ли такие решения?

Оба да. Можно с тем же успехом вызывать сигналы чужого класса, работающего в другом потоке и таким образом менять его значения.

CrossFire ★★★★★
()

могу ли я его переносить туда в контструкторе

В теории - да, на практике - говнокод.

Есть у меня в классе структура, переменная etc которую могут менять в разных потоках.

Кто кого может менять? Вы хотите менять переменную класса, копии которого запущенны в разных потоках? А смысл вообще? В теории мютекс не нужен, так как сигналы все равно придут по очереди.

anonymous
()
Ответ на: комментарий от anonymous

1. Подробнее можно про говнокод? Если заранее известно, что операции данного класса должны выполняться в отдельном треде, чтобы в основном классе не плодить конекты, а перенести их в конструктор. 2. Ну есть некая структура с данными , например, и какие-то поля этой структуры может менять ф-ции из основного треда, какие-то из треда этого класса.

hell_wood
() автор топика

1. Если я хочу чтобы один класс выполнялся в своем потоке могу ли я его переносить туда в контструкторе?

Вполне, я бы только придрался к фразе «класс выполняется в потоке». Код функций класса может быть вызван из любого потока и таким образом выполняться в совершенно разных потоках одновременно. Вызывая moveToThread(), мы как бы помечаем объкет класса как «принадлежащий» конкретному потоку. Но по сути (если я ничего не забыл), это имеет значение только для определения способа вызова функций-слотов через сигналы, подключенные с Qt::AutoConnection. Если сигнал генерируется объектом, id потока которого не совпадает с id потока «вызываемого» объекта и соединение установленно как Qt::AutoConnection, то вызов будет произведен через очередь сообщений, а не напрямую.

2. Есть у меня в классе структура, переменная etc которую могут менять в разных потоках. Можно ли в таком случае использовать слоты/сигналы без мютекса?

Только если все подключения сделаны в режимах, отличных от Qt::DirectConnection. При использовании Qt::DirectConnection будет прямой вызов функции что приведет к гонкам.

m0rph ★★★★★
()
Ответ на: комментарий от hell_wood

1. Если использовать аккуратно, то норм. Но завтра вы пропишете этот класс переменной класса или вообще в контейнер положите, ну или не вы, и начнется веселье, так как инициализация потока, да и не только, в конструкторе по умолчанию - это и есть быдлокод.

anonymous
()
Ответ на: комментарий от I-Love-Microsoft

кста, да. оборачиваем его методом и не до прописывать коннекты.

hell_wood
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.