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::浅谈信号槽连接,参数在多线程中的使用的更多相关文章

  1. QT信号槽连接

    一:信号槽是什么? Qt的信号和槽机制是Qt的一大特点,实际上这是和MFC中的消息映射机制相似的东西,要完成的事情也差不多,就是发送一个消息然后让其它窗口响应,当然,这里的消息是广义的说法,简单点说就 ...

  2. Qt浅谈内存泄露(总结)

    Qt浅谈内存泄露(总结) 来源 http://blog.csdn.net/taiyang1987912/article/details/29271549 一.简介 Qt内存管理机制:Qt 在内部能够维 ...

  3. Qt浅谈之总结(整理)

    Qt浅谈之总结(整理) 来源 http://blog.csdn.net/taiyang1987912/article/details/32713781 一.简介 QT的一些知识点总结,方便以后查阅. ...

  4. 想在子线程里面触发的信号的槽函数在子线程执行,信号槽连接必须使用DirectConnection 方式(即使跨线程,也可以强迫DirectConnection,而不能是AutoConnection)

    Qt多线程的实现 1.继承QThread,重新run 2.继承Object,调用moveToThread方法 两种方法各有利弊:主要参考:http://blog.51cto.com/9291927/1 ...

  5. 浅谈NLP 文本分类/情感分析 任务中的文本预处理工作

    目录 浅谈NLP 文本分类/情感分析 任务中的文本预处理工作 前言 NLP相关的文本预处理 浅谈NLP 文本分类/情感分析 任务中的文本预处理工作 前言 之所以心血来潮想写这篇博客,是因为最近在关注N ...

  6. Qt——信号槽连接:基于字符串与基于函数的连接之间的不同

    从Qt5.0开始,Qt提供了两种不同的方式进行信号槽的连接:基于 字符串 的连接语法.基于 函数 的连接语法.这两种语法各有利弊,下面对它们的不同点进行总结. 以下几部分详细解释了它们之间的不同,并说 ...

  7. QT信号槽连接语法总结

    信号槽是 Qt 框架引以为豪的机制之一. 所谓信号槽,实际就是观察者模式.当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal).这种触发是没有目的的,类似广播.如果 ...

  8. Qt信号槽连接在有默认形参下的情况思考

    写下这个给自己备忘,比如函数 ) 你在调用端如论是test(3)或者test(),都可以正确调用到这个函数. 但是,如果放到Qt中的信号槽的话,这个还是值得讲一讲的,不然的话,可能会引起相应的误会. ...

  9. Qt开发之信号槽机制

    一.信号槽机制原理 1.如何声明信号槽 Qt头文件中一段的简化版: class Example: public QObject { Q_OBJECT signals: void customSigna ...

随机推荐

  1. 一、Open CV3.0.0 与 VS2012配置

    原创:博乐Bar,转载请注明出处. 第一步,准备软件及开发环境 1.OpenCV 3.0.0 下载地址:http://www.opencv.org.cn/index.php/Download ,下载最 ...

  2. electron-searchMovies

    之前学了electron,前段时间又学了一下vue,为了增加熟练度决定将两者结合做个有趣的东西.想来想去最后决定将原来用 PyQt 写的MovieHeavens重新写一遍,使用electron-vue ...

  3. ReSharper插件功能介绍

    ReSharper是一款功能非常强悍的Visual Studio的辅助插件,这款插件可用于C#,VB.net,XML,Asp.net,XAML,和构建脚本.ReSharper 9.1版本大改进对 Ja ...

  4. Buff系统的实现

    BUFF是很多游戏都在采用的一种临时增益机制.本文讲述如何在基于关系型数据库的网页游戏中实现这一系统:如何扩展该系统:以及如何提高该系统的性能. 引言 BUFF是很多游戏都在采用的一种临时增益机制:与 ...

  5. [Scikit-learn] Dynamic Bayesian Network - Kalman Filter

    看上去不错的网站:http://iacs-courses.seas.harvard.edu/courses/am207/blog/lecture-18.html SciPy Cookbook:http ...

  6. easyui-textbox 只读设置取消

    <script> $(function () { $("#txt_beginAmount").attr('readonly', true); $("#txt_ ...

  7. ios 添加动画的方法

    转自文顶顶大神的博客:http://www.cnblogs.com/wendingding/p/3751519.html ios 开发UI中,经常会用添加动画效果的需求,下面就总结一下,添加动画的三种 ...

  8. NUC970 U-Boot 使用說明

    U-Boot 使用說明U-Boot 是一個主要用於嵌入式系統的開機載入程式, 可以支援多種不同的計算機系統結構, 包括ARM.MIPS.x86與 68K. 這也是一套在GNU通用公共許可證之下發布的自 ...

  9. Apache服务器最新版下载、安装及配置(win版)

    Apache服务器最新版下载.安装及配置(win版) Apache的下载: 登录http://httpd.apache.org/download.cgi 这个地址,找到2.4.10,如下图位置:   ...

  10. CentOS7安装Openvswitch 2.3.1 LTS

    CentOS7安装Openvswitch 2.3.0 LTS,centos7openvswitch 一.环境: 宿主机:windows 8.1 update 3 虚拟机:vmware 11 虚拟机操作 ...