日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Qt::ConnectionType(信号与槽的传递方式)

發布時間:2025/6/17 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Qt::ConnectionType(信号与槽的传递方式) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Qt::AutoConnection

自動連接:(默認值)如果信號在接收者所依附的線程內發射,則等同于直接連接。如果發射信號的線程和接受者所依附的線程不同,則等同于隊列連接。

Qt::DirectConnection

直接連接:當信號發射時,槽函數將直接被調用。無論槽函數所屬對象在哪個線程,槽函數都在發射信號的線程內執行。

Qt::QueuedConnection

隊列連接:當控制權回到接受者所依附線程的事件循環時,槽函數被調用。槽函數在接收者所依附線程執行。也就是說:這種方式既可以在線程內傳遞消息,也可以跨線程傳遞消息

Qt::BlockingQueuedConnection

與Qt::QueuedConnection類似,但是會阻塞等到關聯的slot都被執行。這里出現了阻塞這個詞,說明它是專門用來多線程間傳遞消息的。

?

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(); }? 查看運行結果:

??"main thread id:" 0xf08

??"my object thread id:" 0x216c

????顯然主線程與槽函數的線程是不同的(你可以多次嘗試,屢試不爽。。。),因為moveToThread后MyObject所在的線程為QThread,繼上面介紹的thread.start()執行后首先會發射started()信號,也就是說started()信號發射是在次線程中進行的,所以無論采取Qt::AutoConnection、Qt::DirectConnection、Qt::QueuedConnection哪種連接方式,主線程與槽函數的線程都是不同的。

?

1、修改代碼如下:

MyObject object;QThread thread;//object.moveToThread(&thread);QObject::connect(&thread, SIGNAL(started()), &object, SLOT(start()), Qt::DirectConnection);thread.start(); 查看運行結果:

??"main thread id:" 0x2688

??"my object thread id:" 0x2110?

????顯然主線程與槽函數的線程是不同的,MyObject所依附的線程為主線程(因為注釋掉了moveToThread),繼上面介紹的Qt::DirectConnection(無論槽函數所屬對象在哪個線程,槽函數都在發射信號的線程內執行)。也就是說started()信號發射是在次線程中進行的,槽函數也是在次線程中進行的,所以主線程與槽函數的線程是不同的。

?

2、修改代碼如下:

MyObject object;QThread thread;//object.moveToThread(&thread);QObject::connect(&thread, SIGNAL(started()), &object, SLOT(start()), Qt::QueuedConnection);thread.start();

查看運行結果:

??"main thread id:" 0x24ec

??"my object thread id:" 0x24ec?

????顯然主線程與槽函數的線程是相同的,繼上面介紹的Qt::QueuedConnection(槽函數在接收者所依附線程執行)。也就是說started()信號發射是在次線程中進行的,但MyObject所依附的線程為主線程(因為注釋掉了moveToThread),所以主線程與槽函數的線程必然是相同的。

?

3、修改代碼如下:

MyObject object;QThread thread;//object.moveToThread(&thread);QObject::connect(&thread, SIGNAL(started()), &object, SLOT(start()), Qt::AutoConnection);thread.start(); 查看運行結果:

??"main thread id:" 0x2700

??"my object thread id:" 0x2700?

????顯然主線程與槽函數的線程是相同的,MyObject所依附的線程為主線程(因為注釋掉了moveToThread),繼上面介紹的Qt::AutoConnection(如果信號在接收者所依附的線程內發射,則等同于直接連接。如果發射信號的線程和接受者所依附的線程不同,則等同于隊列連接。)。因為started()信號和MyObject依附的線程不同,所以結果和Qt::QueuedConnection對應的相同,所以主線程與槽函數的線程是相同的。

轉載于:https://www.cnblogs.com/senior-engineer/p/6186226.html

總結

以上是生活随笔為你收集整理的Qt::ConnectionType(信号与槽的传递方式)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。