Я хочу написать некоторый класс, который должен работать в собственном потоке.
Я прочитал эту статью: http://wiki.qt.io/Threads_Events_QObjects
, Он рекомендует перемещать объект, который должен работать в собственном потоке, например:
TestClass tst;
QThread *thread = new QThread();
tst.moveToThread(thread);
thread->start();
QObject::connect(thread, SIGNAL(started()), &tst, SLOT(start()));
И в slot
TestClass ставлю все процедуры инициализации.
1. Могу ли я переместить ToTread в конструктор TestClass? Подобно:
TestClass::TestClass() {
QThread *thread = new QThread();
this->moveToThread(thread);
thread->start();
QObject::connect(thread, SIGNAL(started()), this, SLOT(start()));
}
После этого все объекты этого класса будут работать в собственных потоках.
В TestClass
У меня есть личное struct
которые могут быть изменены в обоих потоках.
Должен ли я использовать mutex
для этого или используйте сигнал / слоты:
void TestClass::changeStruct(int newValue) {
// invoked in main thread
emit this->changeValue(newValue);
}
// slot
void TestClass::changeStructSlot(int newValue) {
// this slot will be invoked in the second thread
this._struct.val = newValue;
}
Я бы не стал этого делать, по крайней мере, с точки зрения дизайна. На вершине чего TestClass
предполагается, что вы пытаетесь добавить внутреннее управление потоками. Также TestClass
Деструктор будет немного сложным из-за управления потоками.
каждый TestClass
объект имеет свой struct
, Если вызов из основного потока является единственным способом изменить val
тогда ничего не надо делать. Если val
может быть изменен из более чем 1 потока, включая его собственный, затем использовать QMutex
,
Других решений пока нет …