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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Qt笔记-对connect中第5个进行多组实验(对信号与槽进一步认识)

發布時間:2025/3/15 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Qt笔记-对connect中第5个进行多组实验(对信号与槽进一步认识) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

官方關于第5個參數的介紹:

Qt::AutoConnection:默認的連接方式,當發起信號和接收槽到同一線程時這個值為Qt::DirectConnection,當在不同線程時這個值為Qt::QueuedConnection。

Qt::DirectConnection:發起信號槽函數會立馬觸發。這個槽函數會在發起信號的線程中執行。

Qt::QueuedConnection:將信號放到隊列中,然后在槽函數線程依次執行。

Qt::BlockingQueuedConnection:在Qt::QueuedConnection的基礎上,信號發起者當接收者的槽沒有調用完成一直處于阻塞狀態,這種容易形成死鎖。

Qt::UniqueConnection:這個Type可以和上面所有的類型進行組合,使用"|"連接。當要變成其他方式時,QObject::connection會返回false。連接中這種方式static_cast<Qt::ConnectionType>(Qt::QueuedConnection | Qt::UniqueConnection)。

?

代碼結構如下:

其他源碼如下:

Demo1.h

#ifndef DEMO1_H #define DEMO1_H#include <QThread>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_H

ReceClass.h

#ifndef RECECLASS_H #define RECECLASS_H#include <QObject>class ReceClass : public QObject {Q_OBJECT public:explicit ReceClass(QObject *parent = nullptr);public slots:void receMsg(QString msg); };#endif // RECECLASS_H

Demo1.cpp

#include "Demo1.h" #include <QDebug>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 <QDebug> #include <QThread>ReceClass::ReceClass(QObject *parent) : QObject(parent) {}void ReceClass::receMsg(QString msg) {qDebug() << QThread::currentThread() << " Get msg: " + msg;QThread::sleep(1); }

下面來測試下接受者和發起者在不同線程使用Qt::QueuedConnection會造成什么樣的現象

在發起者和接受者處于不同線程中,將數據會放到一個隊列中,然后慢慢進行調用。這個功能很有用,信號與槽里面自帶隊列結構,在很多消息處理場景里面可以用這種模式。

?

如下Qt::QueueConnection時,現象如下:

這里可以看到,官方說這個一般是在發起者和接受者在同一線程時使用,當在不同線程時,接受者將會被放到發起者的線程里面進行調用,這個還是比較神奇的,Qt的信號與槽還是比較牛逼的。

代碼如下:

#include <QCoreApplication> #include "Demo1.h" #include "ReceClass.h" #include <QDebug>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::ConnectionType>(Qt::QueuedConnection | Qt::UniqueConnection)); // qDebug() << QObject::connect(&demo2, &Demo1::sendMsg, &receClass, &ReceClass::receMsg, static_cast<Qt::ConnectionType>(Qt::QueuedConnection | Qt::UniqueConnection)); // qDebug() << QObject::connect(&demo1, &Demo1::sendMsg, &receClass, &ReceClass::receMsg, static_cast<Qt::ConnectionType>(Qt::DirectConnection | Qt::UniqueConnection)); // qDebug() << QObject::connect(&demo2, &Demo1::sendMsg, &receClass, &ReceClass::receMsg, static_cast<Qt::ConnectionType>(Qt::DirectConnection | Qt::UniqueConnection));//rundemo1.setMsg("demo1");demo2.setMsg("demo2");demo1.start();demo2.start();return a.exec(); }

?

如下Qt::BlockingQueueConnection時,現象如下:

他是將數據放到隊列里面,然后等槽函數觸發完成后,再不阻塞,這里可以看到,發起者是一個線程,調用者是另外一個線程。

?

下面是關于Qt::UniqueConnection的使用,這個相當于輔助。

代碼如下:

#include <QCoreApplication> #include "Demo1.h" #include "ReceClass.h" #include <QDebug>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::ConnectionType>(Qt::QueuedConnection | Qt::UniqueConnection));qDebug() << QObject::connect(&demo2, &Demo1::sendMsg, &receClass, &ReceClass::receMsg, static_cast<Qt::ConnectionType>(Qt::QueuedConnection | Qt::UniqueConnection));qDebug() << QObject::connect(&demo1, &Demo1::sendMsg, &receClass, &ReceClass::receMsg, static_cast<Qt::ConnectionType>(Qt::DirectConnection | Qt::UniqueConnection));qDebug() << QObject::connect(&demo2, &Demo1::sendMsg, &receClass, &ReceClass::receMsg, static_cast<Qt::ConnectionType>(Qt::DirectConnection | Qt::UniqueConnection));//rundemo1.setMsg("demo1");demo2.setMsg("demo2");demo1.start();demo2.start();return a.exec(); }

?

運行截圖如下:

可見帶上這個后,QObject::connection就會綁定失敗。

本次實驗就這么多。

?

?

源碼打包下載地址:

https://github.com/fengfanchen/Qt/tree/master/ConnectionTest

?

總結

以上是生活随笔為你收集整理的Qt笔记-对connect中第5个进行多组实验(对信号与槽进一步认识)的全部內容,希望文章能夠幫你解決所遇到的問題。

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