QThread moveToThread. Синхронизация в QThread
Я хочу написать некоторый класс, который должен работать в собственном потоке. Я прочитал эту статью: 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; }
1 ответ
Я бы не стал этого делать по крайней мере с точки зрения дизайна. На вершине чего
TestClass
предполагается, что вы пытаетесь добавить внутреннее управление потоками. ТакжеTestClass
Деструктор будет немного сложным из-за управления потоками.каждый
TestClass
объект имеет свойstruct
, Если вызов из основного потока является единственным способом изменитьval
тогда ничего не надо делать. Еслиval
может быть изменен из более чем 1 потока, включая его собственный, затем использоватьQMutex
,