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