Qt::ConnectionType(信号与槽的传递方式)
Qt::AutoConnection
自動(dòng)連接:(默認(rèn)值)如果信號在接收者所依附的線程內(nèi)發(fā)射,則等同于直接連接。如果發(fā)射信號的線程和接受者所依附的線程不同,則等同于隊(duì)列連接。
Qt::DirectConnection
直接連接:當(dāng)信號發(fā)射時(shí),槽函數(shù)將直接被調(diào)用。無論槽函數(shù)所屬對象在哪個(gè)線程,槽函數(shù)都在發(fā)射信號的線程內(nèi)執(zhí)行。
Qt::QueuedConnection
隊(duì)列連接:當(dāng)控制權(quán)回到接受者所依附線程的事件循環(huán)時(shí),槽函數(shù)被調(diào)用。槽函數(shù)在接收者所依附線程執(zhí)行。也就是說:這種方式既可以在線程內(nèi)傳遞消息,也可以跨線程傳遞消息
Qt::BlockingQueuedConnection
與Qt::QueuedConnection類似,但是會(huì)阻塞等到關(guān)聯(lián)的slot都被執(zhí)行。這里出現(xiàn)了阻塞這個(gè)詞,說明它是專門用來多線程間傳遞消息的。
?
MyObject.h #ifndef MYOBJECT_H #define MYOBJECT_H#include class MyObject : public QObject {Q_OBJECTpublic:explicit MyObject(QObject *parent = 0);public slots:void start(); };#endif // MYOBJECT_H MyObject.cpp #include "MyObject.h" #include #include MyObject::MyObject(QObject *parent): QObject(parent) {}void MyObject::start() {qDebug() << QString("my object thread id:") << QThread::currentThreadId(); } main.cpp #include "MyObject.h" #include #include #include int main(int argc, char *argv[]) {QApplication a(argc, argv);qDebug() << QString("main thread id:") << QThread::currentThreadId();MyObject object;QThread thread;object.moveToThread(&thread);QObject::connect(&thread, SIGNAL(started()), &object, SLOT(start()));thread.start();return a.exec(); }? 查看運(yùn)行結(jié)果:??"main thread id:" 0xf08
??"my object thread id:" 0x216c
????顯然主線程與槽函數(shù)的線程是不同的(你可以多次嘗試,屢試不爽。。。),因?yàn)閙oveToThread后MyObject所在的線程為QThread,繼上面介紹的thread.start()執(zhí)行后首先會(huì)發(fā)射started()信號,也就是說started()信號發(fā)射是在次線程中進(jìn)行的,所以無論采取Qt::AutoConnection、Qt::DirectConnection、Qt::QueuedConnection哪種連接方式,主線程與槽函數(shù)的線程都是不同的。
?
1、修改代碼如下:
MyObject object;QThread thread;//object.moveToThread(&thread);QObject::connect(&thread, SIGNAL(started()), &object, SLOT(start()), Qt::DirectConnection);thread.start(); 查看運(yùn)行結(jié)果:??"main thread id:" 0x2688
??"my object thread id:" 0x2110?
????顯然主線程與槽函數(shù)的線程是不同的,MyObject所依附的線程為主線程(因?yàn)樽⑨尩袅薽oveToThread),繼上面介紹的Qt::DirectConnection(無論槽函數(shù)所屬對象在哪個(gè)線程,槽函數(shù)都在發(fā)射信號的線程內(nèi)執(zhí)行)。也就是說started()信號發(fā)射是在次線程中進(jìn)行的,槽函數(shù)也是在次線程中進(jìn)行的,所以主線程與槽函數(shù)的線程是不同的。
?
2、修改代碼如下:
MyObject object;QThread thread;//object.moveToThread(&thread);QObject::connect(&thread, SIGNAL(started()), &object, SLOT(start()), Qt::QueuedConnection);thread.start();查看運(yùn)行結(jié)果:
??"main thread id:" 0x24ec
??"my object thread id:" 0x24ec?
????顯然主線程與槽函數(shù)的線程是相同的,繼上面介紹的Qt::QueuedConnection(槽函數(shù)在接收者所依附線程執(zhí)行)。也就是說started()信號發(fā)射是在次線程中進(jìn)行的,但MyObject所依附的線程為主線程(因?yàn)樽⑨尩袅薽oveToThread),所以主線程與槽函數(shù)的線程必然是相同的。
?
3、修改代碼如下:
MyObject object;QThread thread;//object.moveToThread(&thread);QObject::connect(&thread, SIGNAL(started()), &object, SLOT(start()), Qt::AutoConnection);thread.start(); 查看運(yùn)行結(jié)果:??"main thread id:" 0x2700
??"my object thread id:" 0x2700?
????顯然主線程與槽函數(shù)的線程是相同的,MyObject所依附的線程為主線程(因?yàn)樽⑨尩袅薽oveToThread),繼上面介紹的Qt::AutoConnection(如果信號在接收者所依附的線程內(nèi)發(fā)射,則等同于直接連接。如果發(fā)射信號的線程和接受者所依附的線程不同,則等同于隊(duì)列連接。)。因?yàn)閟tarted()信號和MyObject依附的線程不同,所以結(jié)果和Qt::QueuedConnection對應(yīng)的相同,所以主線程與槽函數(shù)的線程是相同的。
轉(zhuǎn)載于:https://www.cnblogs.com/senior-engineer/p/6186226.html
總結(jié)
以上是生活随笔為你收集整理的Qt::ConnectionType(信号与槽的传递方式)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Apache Shiro 使用手册(四)
- 下一篇: DataBase project phy