Qt之信号槽的理解

我们在qt中有太多的地方使用信号槽机制来实现我们功能,但是有没有仔细考虑过信号槽机制的原理呢?有没有问过自己以下几个问题:

  • 信号槽是同步的还是异步的,是阻塞的还是非阻塞的
  • 信号槽如何实现的或者说基于什么来实现的

本篇文章就是视图来解答上面的疑问。好了,进入整体吧,首先介绍一下如何使用信号槽,这个大家都会,但是还是有必须要从头开始说起,使用信号槽需要使用到connect方法,该方法的声明如下:

cpp 复制代码
[static] QMetaObject::Connection QObject::connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection)

上面的声明中各个参数的介绍如下:

sender:表示的是发送者对象的指针,类型是QObject*

signal:表示的是发送者发送的信号,类型是const char*

receiver:表示的是接受者对象的指针,类型同样是QObject*

method:表示的是接收者的槽函数名称,类型是const char*

AutoConnection:表示的是连接类型,这一个枚举类型,类型是Qt::ConnectionType,枚举值有如下几种:

  • Qt::AutoConnection:该值是默认值,如果调用connect方法时,不指定AutoConnection的值,那么默认使用这个值作为默认值。这个值的含义是如果发送信号的线程和接收对象所在线程为同一个线程,那么AutoConnection=Qt::DirectConnection;否则AutoConnection=Qt::QueuedConnection。注意这里强调的是在那个线程发送对象,而不是说发送对象在那个进程创建的,这里不要混淆了,再说清楚一点就是即使发动对象和接收对象在同一个线程,但是发送信号在别的线程也会AutoConnection=Qt::QueuedConnection。
  • Qt::DirectConnection:该值的含义是槽函数会在信号发送线程中直接调用,即槽函数会在信号发送线程中执行,很明显这是同步调用
  • Qt::QueuedConnection:队列连接,此种连接方式造成的结果是槽函数要在接受者对象所在线程执行。这与DirectConnection连接方式是不同的。并且此种连接方式是通过触发事件循环完成的,即采用此种方式最终是通过postEvent方法将事件发送到接收者对象所在线程的事件队列,进而通过事件队列循环来实现槽函数调用的,从这里可以看出这是一个异步调用
  • Qt::BlockingQueuedConnection:此种连接方式的功能与QueuedConnection基本一致,除一点外就是信号发送后,信号发送线程会阻塞在发信号的语句,待接收者对象所在线程槽函数被执行并返回后,才会继续往下执行。但是需要注意的是若采用此种方式,信号发送线程不能与接收者对象所在线程在同一个线程,否则会导致程序死锁。这里我有一个问题,就是采用这种连接方式槽函数执行结果如何返回给信号发送线程。(这里还是要强调信号发送对象所在线程线程与信号发送线程这二者可能并不一样,这二者不能简单的画等号)。至此可以看出此种连接方式也是异步调用
  • Qt::UniqueConnection:此种连接方式不能单独使用,必须与上面的几种连接方式组合使用,他的含义是确保相同的发送者对象、相同的信号、相同的接受者对象,相同的槽函数只能被绑定一次,否则调用connect方式会失败。
相关推荐
ghie90901 分钟前
GPS抗干扰算法MATLAB实现
开发语言·算法·matlab
ytttr8739 分钟前
基于MATLAB解决车辆路径问题(VRP)
开发语言·matlab
沛沛老爹10 分钟前
Web开发者突围AI战场:Agent Skills元工具性能优化实战指南——像优化Spring Boot一样提升AI吞吐量
java·开发语言·人工智能·spring boot·性能优化·架构·企业开发
一只爱学习的小鱼儿14 分钟前
在QT中使用饼状图进行数据分析
开发语言·qt·数据分析
亓才孓32 分钟前
[认识异常和错误]java
java·开发语言
码农水水39 分钟前
中国电网Java面试被问:流批一体架构的实现和状态管理
java·c语言·开发语言·面试·职场和发展·架构·kafka
1***43801 小时前
C++跨平台开发的核心挑战线程管理等基础功能
开发语言·c++
做萤石二次开发的哈哈1 小时前
萤石开放平台 萤石可编程设备 | 设备脚本自定义开发
开发语言·python·萤石云·萤石·萤石开放平台
无风听海1 小时前
深入讲解 C# 中 string 如何支持 CultureInfo
开发语言·c#
yaoxin5211231 小时前
291. Java Stream API - 从正则表达式创建 Stream
java·开发语言