Qt多线程编程中的对象线程与函数执行线程(2)

同时,在connect函数中由于obj和this(这里是t2)不是在同一个线程中,因此会采用QueuedConnection的方式,其slot函数由this对象所在的线程即主线程来执行。这里有一个特别容易误解的地方,就是这个slot函数虽然是子线程SubThread2的一个成员函数,connect操作也是在子线程内完成的,但是该函数的执行却不在子线程内,而是在主线程内。

那么如果想让相应的slot函数在子线程内执行,该如何做呢?在子线程的run函数中创建obj对象的同时,在执行connect时指定连接方式为DirectConnection,这样就可以使slot函数在子线程中运行,因为DirectConnection的方式始终由sender对象的线程执行。如

////////////////////////////////////////////////////////    // class SubThread3    ////////////////////////////////////////////////////////    SubThread3::SubThread3(QObject* parent)       : SubThread(parent)   {       obj=0;   }   // reimplement run    void SubThread3::run()   {       obj = new SomeObject();       connect(obj, SIGNAL(someSignal()), this, SLOT(someSlot()),               Qt::DirectConnection);       obj->callEmitSignal();       exec();   }

最后,该程序的运行结果应该是:

"SubThread1::obj's thread is MAIN thread; someSlot executed in MAIN thread;"    "SubThread2::obj's thread is SUB thread; someSlot executed in MAIN thread;"    "SubThread3::obj's thread is SUB thread; someSlot executed in SUB thread;" 

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wywzfg.html