I want to write some class which has to work in own thread.
I've read this article: http://wiki.qt.io/Threads_Events_QObjects
. It advises to move object which has to work in own thread, like:
TestClass tst;
QThread *thread = new QThread();
tst.moveToThread(thread);
thread->start();
QObject::connect(thread, SIGNAL(started()), &tst, SLOT(start()));
And in slot
of TestClass I put all initializations procedures.
1. Can I moveToThread in TestClass' constructor? Like:
TestClass::TestClass() {
QThread *thread = new QThread();
this->moveToThread(thread);
thread->start();
QObject::connect(thread, SIGNAL(started()), this, SLOT(start()));
}
After that all objects of this class will be working in own threads.
In
TestClass
I have privatestruct
which can be changed in both threads. Should I usemutex
for that or use signal/slots: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; }
I wouldn't do it at least from the design point of view. On top of what
TestClass
is supposed to do you try to add internal thread management. AlsoTestClass
destructor is going to be little bit complicated because of thread management.Every
TestClass
object has its ownstruct
. If the call from main thread is the only way to changeval
then nothing has to be done. If theval
can be changed from more than 1 thread including its own then useQMutex
.