令人不解的问题:
当槽函数是线程类的成员时,为什么依然不在本线程内被调用执行?
隐藏的问题:
对象依附于哪一个线程?
对象的依附性与槽函数执行的关系?
对象的依附性是否可以改变?
对象依附于哪个线程?
默认情况下,对象依附于自身被创建的线程
例如:对象在主线程(main()函数)中被创建,则依附于主线程
int main(int argc, char* argv[])
{
//...
TestThread t; //依附于主线程
MyObject m; //依附于主线程
}
对象的依附性与槽函数执行的关系?
默认情况下,槽函数在其所依附的线程中被调用执行
int main(int argc, char* argv[])
{
//...
TestThread t; //依附于主线程
MyObject m; //依附于主线程
//下面连接中的槽函数都在主线程中被调用执行
QObject::connect(&t,SIGNAL(started()),&m,SLOT(getStarted()));
QObject::connect(&t,SIGNAL(testSignal()),&m,SLOT(testSlot()));
}
对象的依附性是否可以改变?
QObject::moveToThread用于改变对象的线程的依附性,使得对象的槽函数在依附的线程中被调用执行
int main(int argc, char* argv[])
{
//...
TestThread t; //依附于主线程
MyObject m; //依附于主线程
//改变对象m的线程的依附性,使其依附于线程t
m.moveToThread(&t)
}
对象的依附性
MyObject.h
#ifndef MYOBJECT_H #define MYOBJECT_H #include <QObject> class MyObject : public QObject { Q_OBJECT public: MyObject(); protected slots: void getStarted(); void testSlot(); }; #endif // MYOBJECT_H