同时,在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;"