令人不解的问题:

当槽函数是线程类的成员时,为什么依然不在本线程内被调用执行?

隐藏的问题:
对象依附于哪一个线程?
对象的依附性与槽函数执行的关系?
对象的依附性是否可以改变?

对象依附于哪个线程?
默认情况下,对象依附于自身被创建的线程
例如:对象在主线程(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
View Code

相关文章: