揉着我的奶从后面进去视频-亚洲人成中文字幕在线观看-国产精品成人3p一区二区三区-亚洲 a v无 码免 费 成 人 a v

首頁 > 宏觀 >

天天熱點(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 21:50:03 來源:QT教程

官方關(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(Qt::QueuedConnection | Qt::UniqueConnection)。

代碼結(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

關(guān)鍵詞

最近更新