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个进行多组实验(对信号与槽进一步认识)相关推荐
- qt中的qwidget如何实现自定义部件_2.3信号和槽(中)
2.3.1 在ui中编辑信号槽 这一小节我们来看一下如何在ui中编辑信号槽. 我们想要在ui中实现点击按钮,能够控制进度条的显隐. 新建GUI项目SignalsAndSlots2,类名SignalsA ...
- Qt工作笔记-信号与槽参数匹配问题
今天,我把Qt3代码转化为Qt5,控件啥的都要换,李主任说了下为什么以前的信号和槽函数参数不匹配!!这句话让我对Qt中的信号与槽进一步有了了解. 下面的这个演示源码是基于这个博客的 https://b ...
- [Qt教程] 第44篇 进阶(四)信号和槽
[Qt教程] 第44篇 进阶(四)信号和槽 楼主 发表于 2013-9-12 16:48:59 | 查看: 298| 回复: 0 信号和槽 版权声明 该文章原创于Qter开源社区 导语 在前面的内容 ...
- theoretical-零基础学Qt4编程之Qt核心机制与原理之信号与槽-
信号与槽 信号和槽机制是Qt的核心机制之一,要掌握Qt编程就需要对信号和槽有所了解.信号和槽是一种高级接口,它们被应用于对象之间的通信,它们是Qt的核心特性,也是Qt不同于其它同类工具包的重要地方之一 ...
- Qt源码分析之信号和槽机制
Qt的信号和槽机制是Qt的一大特点,实际上这是和MFC中的消息映射机制相似的东西,要完成的事情也差不多,就是发送一个消息然后让其它窗口响应,当然,这里的消息是广义的 说法,简单点说就是如何在一个类的一 ...
- QT的核心机制信号和槽、QT三大护法
1.QT 三大护法 Qapplication:控制程序执行流程 QWidget:是所有界面组件类的父类,用来绘制界面 QLayout: 是一个布局管理器,可以用来设置窗口中组件的摆放方式 2.如何把信 ...
- Qt 信号和槽 事件处理
一:Qt信号和槽概述 信号与槽作为QT的核心机制在QT编程中有着广泛的应用,本章介绍了信号与槽的一些基本概念.元对象工具以及在实际使用过程中应注意的一些问题. 信号和槽机制是QT的核心机制,要精通QT ...
- [QT]2022.4.30 信号和槽的小玩意儿
目录 前言: 信号和槽的自定义 关于自定义信号 自定义信号和槽的重载 信号和信号的连接 拓展 信号槽中的lamba表达式 总结 前言: 提到信号和槽(Signal & Slot),首先我们来看 ...
- Qt信号和槽函数连接不成功原因
Qt信号和槽连接失败原因主要有以下几点: 1.槽函数并没有声明在类的public slots(或private slots或protected slots)里,因此,所想要成为槽函数的那个函数只是普普 ...
最新文章
- 2021年大数据常用语言Scala(十三):基础语法学习 函数 重点掌握
- DevExpress —— dxDataGrid
- GetFileAttributesEx读取文件相应属性
- jenkins docker 自动部署 构建_jenkins+docker+vue项目的自动部署环境
- (WPF) DataGrid之绑定
- 搭建自动安装的linux,RedHat7搭建无人值守自动安装Linux操作系统(PXE+Kickstart)
- java 上传远程图片,java上传图片到另一台服务器上,怎么解决
- 测试基础-06-测试计划编写
- 基于vue + element 的后台管理系统
- 正则表达式 IP域名
- 华为P40或将搭载鸿蒙,华为P40或将在明年3月发布,很有可能是首部搭载鸿蒙的手机...
- fiddler显示服务器IP
- 聚合物/硅胶色谱填粒径1.7μm到50μm
- 平面变压器的设计(翻译)(4)
- 微信小程序 input隐藏和不可操作的设置
- 阿里数据研发工程师实习生面试经历
- 高效工作-使用石墨文档进行信息收集
- CAN总线错误分析方法
- 发送给客户的文件,怕泄漏怎么办?
- 服务器网站需要多大硬盘,做网站服务器硬盘多大
热门文章
- python最简单的wsgi例子
- structs2拦截器详解
- 【推荐】(SqlServer)不公开存储过程sp_Msforeachtable与sp_Msforeachdb详解
- QTP User-Defined Function 学习经验汇总
- 企业要搞数字化转型,是用一整套ERP,还是各搞各的数据系统?
- 不懂代码,如何做出实时刷新的数据大屏?
- 05CRecordset类
- 现在的编程语言越来越多,为什么 C 和 C++ 还没有被现在的时代淘汰呢?
- mysql存储过程执行update_MySQL存储过程实现动态执行SQL
- q87主板支持cpu型号_网络上那些300多元的微星B365M主板到底是真货假货?价格便宜一半...