官方关于第5个参数的介绍:
Qt::AutoConnection:默认的连接方式,当发起信号和接收槽到同一线程时这个值为Qt::DirectConnection,当在不同线程时这个值为Qt::QueuedConnection。
Qt::DirectConnection:发起信号槽函数会立马触发。这个槽函数会在发起信号的线程中执行。
【资料图】
Qt::QueuedConnection:将信号放到队列中,然后在槽函数线程依次执行。
Qt::BlockingQueuedConnection:在Qt::QueuedConnection的基础上,信号发起者当接收者的槽没有调用完成一直处于阻塞状态,这种容易形成死锁。
Qt::UniqueConnection:这个Type可以和上面所有的类型进行组合,使用\"|\"连接。当要变成其他方式时,QObject::connection会返回false。连接中这种方式static_cast
代码结构如下:
其他源码如下:
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);}
下面来测试下接受者和发起者在不同线程使用Qt::QueuedConnection会造成什么样的现象
在发起者和接受者处于不同线程中,将数据会放到一个队列中,然后慢慢进行调用。这个功能很有用,信号与槽里面自带队列结构,在很多消息处理场景里面可以用这种模式。
如下Qt::QueueConnection时,现象如下:
这里可以看到,官方说这个一般是在发起者和接受者在同一线程时使用,当在不同线程时,接受者将会被放到发起者的线程里面进行调用,这个还是比较神奇的,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时,现象如下:
他是将数据放到队列里面,然后等槽函数触发完成后,再不阻塞,这里可以看到,发起者是一个线程,调用者是另外一个线程。
下面是关于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就会绑定失败。
本次实验就这么多。
【领 QT开发教程 学习资料, 点击下方链接莬费领取↓↓ ,先码住不迷路~】
点击这里:
原文链接:https://it1995.blog.csdn.net/article/details/109755583
为您推荐
- (2023-04-29)全球快资讯丨利欧股份(002131):消费复苏业绩拐点已至 “奇思妙想”AI落地在即
- (2023-04-29)环球最新:伯特利(603596)公司信息更新报告:2023Q1业绩高速增长 智能电控产品加速放量
- (2023-04-29)保隆科技(603197):Q1业绩大幅增长 新业务打开成长空间|全球观速讯
- (2023-04-29)山西汾酒(600809):产品结构持续升级 省外市场增速亮眼-全球速读
- (2023-04-29)证券行业1Q23基金保有量数据点评:独立代销机构增长明显|每日热文
- (2023-04-29)美迪西(688202)2022A&23Q1财报点评:全年利润承压 Q1企稳回升-天天滚动
- (2023-04-29)三峡能源(600905):海风加速推进 储能、抽蓄或有惊喜_世界信息
最近更新
- (2023-04-29)天天热点评!Qt笔记-对connect中第5个进行多组实验(对信号与槽进一步认识)
- (2023-04-29)复旦碳价指数:2023年5月全国碳市场CEA价格指数普降
- (2023-04-29)世界消息!118jk+开奖直播现场开奖_118jk开奖直播现场
- (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万元 兴图新科上市以来业绩三连降|环球微速讯
- (2023-04-29)中泰证券:给予茂莱光学买入评级 天天速看
- (2023-04-29)一站体验全球咖啡文化 上海静安世界咖啡文化节首创咖啡文化休闲街 环球热点评
- (2023-04-29)北交所&新三板周报:北交所副总经理:探索推出REITs产品;晟楠科技5月5日申购;我国全面实现不动产统一登记_世界热推荐
- (2023-04-29)华为在软件工具生态埋下多颗“种子”,静候国产软件产业萌芽
- (2023-04-29)金至尊黄金价格今天多少一克(2023年04月29日)-环球新要闻
- (2023-04-29)为了欧洲杯!马奎尔今夏被迫离开曼联,有可能去罗马联手穆里尼奥
- (2023-04-29)汽车零部件:拜罗伊特大学开发新玻璃隔板 提高电池安全
- (2023-04-29)福克斯:基根-穆雷有一个光明的未来 他在像老将那样打球
- (2023-04-29)“北向互换通”落地 金融市场开放迎来新里程碑
- (2023-04-29)全球速讯:河北省教育厅职称评定怎么查(河北省教育厅职称评定)
- (2023-04-29)银行存款利率,还要继续降?
- (2023-04-29)重磅发布!温州今年谋划推出首批十项突破性举措
- (2023-04-29)热议:美国总统拜登批准!重大灾难声明→
- (2023-04-29)湖北三大机制为三大都市圈发展“加油”_环球微资讯
- (2023-04-29)消费电子行业深度研究:AI+制造业赋能,机器视觉开启掘金新大陆|当前观点
- (2023-04-29)志勇双全 热门
- (2023-04-29)cdr概念股是什么意思_cdr是什么意思
- (2023-04-29)变压器kva什么意思_变压器KVA是表示什么意思 环球观天下
- (2023-04-29)世界报道:百分位数是什么意思_分位数是什么意思
- (2023-04-29)天天热推荐:濉溪县气象局发布大风蓝色预警【IV级/一般】【2023-04-29】
- (2023-04-29)魔法药水音乐_魔法药水
- (2023-04-28)全球热点评!360网页怎么截图长图 360网页怎么截图
- (2023-04-28)亿安天下(870849):2022年归母净利2335.87万元,同比减少19.47%