官方關(guān)于第5個參數(shù)的介紹:
Qt::AutoConnection:默認的連接方式,當發(fā)起信號和接收槽到同一線程時這個值為Qt::DirectConnection,當在不同線程時這個值為Qt::QueuedConnection。
Qt::DirectConnection:發(fā)起信號槽函數(shù)會立馬觸發(fā)。這個槽函數(shù)會在發(fā)起信號的線程中執(zhí)行。
【資料圖】
Qt::QueuedConnection:將信號放到隊列中,然后在槽函數(shù)線程依次執(zhí)行。
Qt::BlockingQueuedConnection:在Qt::QueuedConnection的基礎(chǔ)上,信號發(fā)起者當接收者的槽沒有調(diào)用完成一直處于阻塞狀態(tài),這種容易形成死鎖。
Qt::UniqueConnection:這個Type可以和上面所有的類型進行組合,使用\"|\"連接。當要變成其他方式時,QObject::connection會返回false。連接中這種方式static_cast
代碼結(jié)構(gòu)如下:
其他源碼如下:
Demo1.h
#ifndef DEMO1_H#define DEMO1_H#include class Demo1 : public QThread{Q_OBJECTvoid run() override;public:void setMsg(const QString &msg);signals:void sendMsg(QString msg);private:QString m_msg;};#endif // DEMO1_HReceClass.h#ifndef RECECLASS_H#define RECECLASS_H#include class ReceClass : public QObject{Q_OBJECTpublic:explicit ReceClass(QObject *parent = nullptr);public slots:void receMsg(QString msg);};#endif // RECECLASS_HDemo1.cpp#include \"Demo1.h\"#include void Demo1::run(){for(int i = 0; i < 10; i++){emit sendMsg(this->m_msg);qDebug() << QThread::currentThread() << \" emit \" << this->m_msg << \" over\";}qDebug() << QThread::currentThread() << \" msg:\" << this->m_msg << \" over\";}void Demo1::setMsg(const QString &msg){this->m_msg = msg;}ReceClass.cpp#include \"ReceClass.h\"#include #include ReceClass::ReceClass(QObject *parent) : QObject(parent){}void ReceClass::receMsg(QString msg){qDebug() << QThread::currentThread() << \" Get msg: \" + msg;QThread::sleep(1);}
下面來測試下接受者和發(fā)起者在不同線程使用Qt::QueuedConnection會造成什么樣的現(xiàn)象
在發(fā)起者和接受者處于不同線程中,將數(shù)據(jù)會放到一個隊列中,然后慢慢進行調(diào)用。這個功能很有用,信號與槽里面自帶隊列結(jié)構(gòu),在很多消息處理場景里面可以用這種模式。
如下Qt::QueueConnection時,現(xiàn)象如下:
這里可以看到,官方說這個一般是在發(fā)起者和接受者在同一線程時使用,當在不同線程時,接受者將會被放到發(fā)起者的線程里面進行調(diào)用,這個還是比較神奇的,Qt的信號與槽還是比較牛逼的。
代碼如下:
#include #include \"Demo1.h\"#include \"ReceClass.h\"#include int main(int argc, char *argv[]){QCoreApplication a(argc, argv);//initReceClass receClass;Demo1 demo1;Demo1 demo2;//bind// QObject::connect(&demo1, &Demo1::sendMsg, &receClass, &ReceClass::receMsg, Qt::QueuedConnection);// QObject::connect(&demo2, &Demo1::sendMsg, &receClass, &ReceClass::receMsg, Qt::QueuedConnection);QObject::connect(&demo1, &Demo1::sendMsg, &receClass, &ReceClass::receMsg, Qt::DirectConnection);QObject::connect(&demo2, &Demo1::sendMsg, &receClass, &ReceClass::receMsg, Qt::DirectConnection);// qDebug() << QObject::connect(&demo1, &Demo1::sendMsg, &receClass, &ReceClass::receMsg, static_cast(Qt::QueuedConnection | Qt::UniqueConnection));// qDebug() << QObject::connect(&demo2, &Demo1::sendMsg, &receClass, &ReceClass::receMsg, static_cast(Qt::QueuedConnection | Qt::UniqueConnection));// qDebug() << QObject::connect(&demo1, &Demo1::sendMsg, &receClass, &ReceClass::receMsg, static_cast(Qt::DirectConnection | Qt::UniqueConnection));// qDebug() << QObject::connect(&demo2, &Demo1::sendMsg, &receClass, &ReceClass::receMsg, static_cast(Qt::DirectConnection | Qt::UniqueConnection));//rundemo1.setMsg(\"demo1\");demo2.setMsg(\"demo2\");demo1.start();demo2.start();return a.exec();}
如下Qt::BlockingQueueConnection時,現(xiàn)象如下:
他是將數(shù)據(jù)放到隊列里面,然后等槽函數(shù)觸發(fā)完成后,再不阻塞,這里可以看到,發(fā)起者是一個線程,調(diào)用者是另外一個線程。
下面是關(guān)于Qt::UniqueConnection的使用,這個相當于輔助。
代碼如下:
#include #include \"Demo1.h\"#include \"ReceClass.h\"#include int main(int argc, char *argv[]){QCoreApplication a(argc, argv);//initReceClass receClass;Demo1 demo1;Demo1 demo2;//bind// QObject::connect(&demo1, &Demo1::sendMsg, &receClass, &ReceClass::receMsg, Qt::QueuedConnection);// QObject::connect(&demo2, &Demo1::sendMsg, &receClass, &ReceClass::receMsg, Qt::QueuedConnection);// QObject::connect(&demo1, &Demo1::sendMsg, &receClass, &ReceClass::receMsg, Qt::DirectConnection);// QObject::connect(&demo2, &Demo1::sendMsg, &receClass, &ReceClass::receMsg, Qt::DirectConnection);QObject::connect(&demo1, &Demo1::sendMsg, &receClass, &ReceClass::receMsg, Qt::BlockingQueuedConnection);QObject::connect(&demo2, &Demo1::sendMsg, &receClass, &ReceClass::receMsg, Qt::BlockingQueuedConnection);qDebug() << QObject::connect(&demo1, &Demo1::sendMsg, &receClass, &ReceClass::receMsg, static_cast(Qt::QueuedConnection | Qt::UniqueConnection));qDebug() << QObject::connect(&demo2, &Demo1::sendMsg, &receClass, &ReceClass::receMsg, static_cast(Qt::QueuedConnection | Qt::UniqueConnection));qDebug() << QObject::connect(&demo1, &Demo1::sendMsg, &receClass, &ReceClass::receMsg, static_cast(Qt::DirectConnection | Qt::UniqueConnection));qDebug() << QObject::connect(&demo2, &Demo1::sendMsg, &receClass, &ReceClass::receMsg, static_cast(Qt::DirectConnection | Qt::UniqueConnection));//rundemo1.setMsg(\"demo1\");demo2.setMsg(\"demo2\");demo1.start();demo2.start();return a.exec();}
運行截圖如下:
可見帶上這個后,QObject::connection就會綁定失敗。
本次實驗就這么多。
【領(lǐng) QT開發(fā)教程 學(xué)習(xí)資料, 點擊下方鏈接莬費領(lǐng)取↓↓ ,先碼住不迷路~】
點擊這里:
原文鏈接:https://it1995.blog.csdn.net/article/details/109755583
為您推薦
- (2023-04-29)全球快資訊丨利歐股份(002131):消費復(fù)蘇業(yè)績拐點已至 “奇思妙想”AI落地在即
- (2023-04-29)環(huán)球最新:伯特利(603596)公司信息更新報告:2023Q1業(yè)績高速增長 智能電控產(chǎn)品加速放量
- (2023-04-29)保隆科技(603197):Q1業(yè)績大幅增長 新業(yè)務(wù)打開成長空間|全球觀速訊
- (2023-04-29)山西汾酒(600809):產(chǎn)品結(jié)構(gòu)持續(xù)升級 省外市場增速亮眼-全球速讀
- (2023-04-29)證券行業(yè)1Q23基金保有量數(shù)據(jù)點評:獨立代銷機構(gòu)增長明顯|每日熱文
- (2023-04-29)美迪西(688202)2022A&23Q1財報點評:全年利潤承壓 Q1企穩(wěn)回升-天天滾動
- (2023-04-29)三峽能源(600905):海風(fēng)加速推進 儲能、抽蓄或有驚喜_世界信息
最近更新
- (2023-04-29)天天熱點評!Qt筆記-對connect中第5個進行多組實驗(對信號與槽進一步認識)
- (2023-04-29)復(fù)旦碳價指數(shù):2023年5月全國碳市場CEA價格指數(shù)普降
- (2023-04-29)世界消息!118jk+開獎直播現(xiàn)場開獎_118jk開獎直播現(xiàn)場
- (2023-04-29)蘇寧易購一季度歸母凈虧損1.01億元 同比減虧90.22%
- (2023-04-29)今日夢幻列車長的心臟奶媽_夢幻列車長的心臟
- (2023-04-29)每日頭條!博克斯(873500):2022年歸母凈利2312.45萬元,同比減少19.13%
- (2023-04-29)2022年歸母凈利潤虧損7910.4萬元 興圖新科上市以來業(yè)績?nèi)B降|環(huán)球微速訊
- (2023-04-29)中泰證券:給予茂萊光學(xué)買入評級 天天速看
- (2023-04-29)一站體驗全球咖啡文化 上海靜安世界咖啡文化節(jié)首創(chuàng)咖啡文化休閑街 環(huán)球熱點評
- (2023-04-29)北交所&新三板周報:北交所副總經(jīng)理:探索推出REITs產(chǎn)品;晟楠科技5月5日申購;我國全面實現(xiàn)不動產(chǎn)統(tǒng)一登記_世界熱推薦
- (2023-04-29)華為在軟件工具生態(tài)埋下多顆“種子”,靜候國產(chǎn)軟件產(chǎn)業(yè)萌芽
- (2023-04-29)金至尊黃金價格今天多少一克(2023年04月29日)-環(huán)球新要聞
- (2023-04-29)為了歐洲杯!馬奎爾今夏被迫離開曼聯(lián),有可能去羅馬聯(lián)手穆里尼奧
- (2023-04-29)汽車零部件:拜羅伊特大學(xué)開發(fā)新玻璃隔板 提高電池安全
- (2023-04-29)福克斯:基根-穆雷有一個光明的未來 他在像老將那樣打球
- (2023-04-29)“北向互換通”落地 金融市場開放迎來新里程碑
- (2023-04-29)全球速訊:河北省教育廳職稱評定怎么查(河北省教育廳職稱評定)
- (2023-04-29)銀行存款利率,還要繼續(xù)降?
- (2023-04-29)重磅發(fā)布!溫州今年謀劃推出首批十項突破性舉措
- (2023-04-29)熱議:美國總統(tǒng)拜登批準!重大災(zāi)難聲明→
- (2023-04-29)湖北三大機制為三大都市圈發(fā)展“加油”_環(huán)球微資訊
- (2023-04-29)消費電子行業(yè)深度研究:AI+制造業(yè)賦能,機器視覺開啟掘金新大陸|當前觀點
- (2023-04-29)志勇雙全 熱門
- (2023-04-29)cdr概念股是什么意思_cdr是什么意思
- (2023-04-29)變壓器kva什么意思_變壓器KVA是表示什么意思 環(huán)球觀天下
- (2023-04-29)世界報道:百分位數(shù)是什么意思_分位數(shù)是什么意思
- (2023-04-29)天天熱推薦:濉溪縣氣象局發(fā)布大風(fēng)藍色預(yù)警【IV級/一般】【2023-04-29】
- (2023-04-29)魔法藥水音樂_魔法藥水
- (2023-04-28)全球熱點評!360網(wǎng)頁怎么截圖長圖 360網(wǎng)頁怎么截圖
- (2023-04-28)億安天下(870849):2022年歸母凈利2335.87萬元,同比減少19.47%