Qt::浅谈信号槽连接,参数在多线程中的使用
Qt的信号槽有五种连接方式定义在enum Qt::ConnectionType,下面简单介绍
Qt::AutoConnection:自动判断连接方式,如果信号发送对象和执行槽对象在同一线程,那么等于Qt::DirectConnection,如果不是则等于Qt::QueuedConnection
Qt::DirectConnection:直接连接方式,简单说就是直接调用,信号发送会在槽函数执行完毕后返回,但前提是信号和槽的对象必须在同一线程中,否则会出现未知错误
Qt::QueuedConnection:队列连接方式,信号的发送是通知当前线程事件机制增加一个待处理事件,槽的执行不一定能马上返回,发送信号马上返回,两者是异步执行,主要是为了解决信号和槽对象不在同一线程不阻塞的情况
Qt::BlockingQueuedConnection:阻塞队列连接方式,逻辑基本和前者相同,唯一的区别是,发送信号不会马上返回,一定会等到槽执行完毕返回后,才返回信号调用,对于需要阻塞等到返回值结果的时候,可以使用
Qt::UniqueConnection:独立连接方式,这个标识比较少用,可以和上面4个标识做OR运算表示这个连接对象为单例,如果有一样的对象信号绑定了一样的槽,绑定动作会返回失败
单线程的情况没什么好说,第二种方式直接的调用,主要说一下多线程的情况
写UI的同学应该都有使用过以下回调函数,这是因为在qt里子线程不能操作UI相关的对象接口,必须要把事件和动作交给主线程处理

那么一般就会有两种情况,阻塞和非阻塞式;阻塞式就是必须要等到这次动作的返回值才能往下执行,如果以第三种连接方式,即使加上了QGenericReturnArgument也无效,就需要选择第四种连接方式
但是Qt::BlockingQueuedConnection在子线程不受你控制或者不在你自己的代码里的时候,容易发生死锁,比如一个主线程调用子线程的某方法,在这个方法里又发送了信号交给主线程处理事件,由于子线程一直等待主线程处理完事件返回继续往下,但主线程又卡在了调用子线程方法的地方,导致二者直接死锁,所以这个连接方式要慎用,至少你要明白引发这种连接信号一系列的调用关系再来确认怎么处理;另外还有一种情况需要block,那就是参数中有指针的情况,如果这个指针的指向对象是临时变量,当非阻塞方式交出去的时候,可能对象已经析构回收掉了,那么调用参数会访问一个野指针,所以要么拷贝一份指针数据到可靠的地方(至少确认执行的时候数据还在),要么就得用阻塞方式,等待处理结束后,再释放指针指向对象。
Demo代码待续,主要会列举一下几种方式的正常调用写法
Qt::浅谈信号槽连接,参数在多线程中的使用的更多相关文章
- QT信号槽连接
一:信号槽是什么? Qt的信号和槽机制是Qt的一大特点,实际上这是和MFC中的消息映射机制相似的东西,要完成的事情也差不多,就是发送一个消息然后让其它窗口响应,当然,这里的消息是广义的说法,简单点说就 ...
- Qt浅谈内存泄露(总结)
Qt浅谈内存泄露(总结) 来源 http://blog.csdn.net/taiyang1987912/article/details/29271549 一.简介 Qt内存管理机制:Qt 在内部能够维 ...
- Qt浅谈之总结(整理)
Qt浅谈之总结(整理) 来源 http://blog.csdn.net/taiyang1987912/article/details/32713781 一.简介 QT的一些知识点总结,方便以后查阅. ...
- 想在子线程里面触发的信号的槽函数在子线程执行,信号槽连接必须使用DirectConnection 方式(即使跨线程,也可以强迫DirectConnection,而不能是AutoConnection)
Qt多线程的实现 1.继承QThread,重新run 2.继承Object,调用moveToThread方法 两种方法各有利弊:主要参考:http://blog.51cto.com/9291927/1 ...
- 浅谈NLP 文本分类/情感分析 任务中的文本预处理工作
目录 浅谈NLP 文本分类/情感分析 任务中的文本预处理工作 前言 NLP相关的文本预处理 浅谈NLP 文本分类/情感分析 任务中的文本预处理工作 前言 之所以心血来潮想写这篇博客,是因为最近在关注N ...
- Qt——信号槽连接:基于字符串与基于函数的连接之间的不同
从Qt5.0开始,Qt提供了两种不同的方式进行信号槽的连接:基于 字符串 的连接语法.基于 函数 的连接语法.这两种语法各有利弊,下面对它们的不同点进行总结. 以下几部分详细解释了它们之间的不同,并说 ...
- QT信号槽连接语法总结
信号槽是 Qt 框架引以为豪的机制之一. 所谓信号槽,实际就是观察者模式.当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal).这种触发是没有目的的,类似广播.如果 ...
- Qt信号槽连接在有默认形参下的情况思考
写下这个给自己备忘,比如函数 ) 你在调用端如论是test(3)或者test(),都可以正确调用到这个函数. 但是,如果放到Qt中的信号槽的话,这个还是值得讲一讲的,不然的话,可能会引起相应的误会. ...
- Qt开发之信号槽机制
一.信号槽机制原理 1.如何声明信号槽 Qt头文件中一段的简化版: class Example: public QObject { Q_OBJECT signals: void customSigna ...
随机推荐
- Linux基础回想(1)——Linux系统概述
1. 什么是操作系统?它与硬件以及其它软件之间的关系是如何的? 操作系统是控制和管理计算机系统内各种硬件和软件资源.有效组织多道程序执行的系统软件(或程序集合),是用户和计算机之间的接口.详细的说: ...
- c#调用cmd
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.D ...
- Spring配置文件加载流程
http://blog.csdn.net/dy_paradise/article/details/6038990
- Unity3D工程源码目录
2-0 暗黑破坏神3 链接:http://pan.baidu.com/s/1dEAUZoX 密码:cly4 2-1 炉石传说 客户端加服务器端 链接:http://pan.baidu.co ...
- 在你开发完brew应用之后 ,你又如果将brew应用由编译成可以部署到brew真机上的程序包呢
参考自:http://blog.csdn.net/feimor/article/details/6239281 一.准备工作(安装工具) 先安装Visual C++ 6.0,再安装BREW SDK v ...
- Recurrent Neural Network Language Modeling Toolkit代码学习
Recurrent Neural Network Language Modeling Toolkit 工具使用点击打开链接 本博客地址:http://blog.csdn.net/wangxingin ...
- H5 readfile 多图片预览
/** * 多图片前端预览 * @author Tiac */ function preView(_this, offset){ let max_nums = 10;//单位 s let max_si ...
- 使用WdatePicker获取比当前时间大的写法
<input name="today.date" class="Wdate" type="text" onClick="Wd ...
- 图片上传Security Error
jQuery.Uploadify v3.2.js 现在得到的一个原因是跨域 http://www.xuebuyuan.com/848255.html 最近项目中要用文件上传控件,我就想到了Upload ...
- poj_1743 后缀数组
题目大意 给定一串数字,长度为N.定义数字中的某个连续的子串为一个"theme",只要子串满足: (1)长度 >= 5 (2)和该子串相同或者该子串的“变种串”在整串数字中出 ...