Qt::ConnectionType 解析

2014-08-14  来源:本站原创  分类:Qt  人气:6 

signal/slot在底层会使用三种方式传递消息。参见QObject::connect()方法:
bool QObject::connect ( const QObject * sender, const char * signal, const QObject * receiver, const char * method, Qt::ConnectionType type = Qt::AutoCompatConnection )
最后一个参数是就是传递消息的方式了,有四个取值:

Qt::DirectConnection
When emitted, the signal is immediately delivered to the slot.
假设当前有4个slot连接到QPushButton::clicked(bool),当按钮被按下时,QT就把这4个slot按连接的时间顺序调用一遍。显然这种方式不能跨线程(传递消息)。

Qt::QueuedConnection
When emitted, the signal is queued until the event loop is able to deliver it to the slot.
假设当前有4个slot连接到QPushButton::clicked(bool),当按钮被按下时,QT就把这个signal包装成一个 QEvent,放到消息队列里。QApplication::exec()或者线程的QThread::exec()会从消息队列里取消息,然后调用 signal关联的几个slot。这种方式既可以在线程内传递消息,也可以跨线程传递消息。

Qt::BlockingQueuedConnection
Same as QueuedConnection, except that the current thread blocks until the slot has been delivered. This connection type should only be used for receivers in a different thread. Note that misuse of this type can lead to dead locks in your application.
与Qt::QueuedConnection类似,但是会阻塞等到关联的slot都被执行。这里出现了阻塞这个词,说明它是专门用来多线程间传递消息的。

Qt::AutoConnection
If the signal is emitted from the thread in which the receiving object lives, the slot is invoked directly, as with Qt::DirectConnection; otherwise the signal is queued, as with Qt::QueuedConnection.
这种连接类型根据signal和slot是否在同一个线程里自动选择Qt::DirectConnection或Qt::QueuedConnection

这样看来,第一种类型的效率肯定比第二种高,毕竟第二种方式需要将消息存储到队列,而且可能会涉及到大对象的复制(考虑sig_produced(BigObject bo),bo需要复制到队列里)。

相关文章
  • Qt::ConnectionType 解析 2014-08-14

    signal/slot在底层会使用三种方式传递消息.参见QObject::connect()方法: bool QObject::connect ( const QObject * sender, const char * signal, const QObject * receiver, const char * method, Qt::ConnectionType type = Qt::AutoCompatConnection ) 最后一个参数是就是传递消息的方式了,有四个取值: Qt::Di

  • 阅读QtCreator--Concurrent预备知识 2012-07-19

    在QtCreator当中用到了不少的Concurrent(并发),比如编译时,搜索时等.其实在很多场合中都需要用到,一般是CPU去做一项大任务(花费较长时间)时相应用户操作.另一个重要用途就是在当前这个多核,甚至多CPU的年代,并行变成成为一种时尚了,它也确实提高了应用程序的性能.我的电脑是单CPU,2核心4线程,所以相比单应用程序,应该可以将性能提高将近4倍(当然不会是4倍的).我所听过的有很多库是这方面的,比如CUDA,OpenCL,OpenMP.Qt是怎么做的还真不知道,望高手指教.首先来

  • Qt5 与 Qt4 的点点差异------信号与槽 2014-01-14

    在 Qt 5 中,QObject::connect()有五个重载: QMetaObject::Connection connect(const QObject *, const char *, const QObject *, const char *, Qt::ConnectionType); QMetaObject::Connection connect(const QObject *, const QMetaMethod &, const QObject *, const QMetaMet

  • 寻找最小公有接口 2014-06-26

    接口最小化原则建议我们创建的接口数量应该尽可能少,并且这些接口是容易理解记住且是正交的.很多面向对象的框架.系统中都会有一个公共的基类.这个基类提供了一些最小化的公有接口.这些公共接口提供给所有对象一些基础性必需的接口.这些接口的定义需要对整个应用领域有很好的理解,才能抽象出位于最高概念层次的接口.正是有了很多成功的示例,这些指导性的经验让我们自己来选择最小化公有接口变得也很容易了. 这篇文章就是说明哪些接口是我们需要的.具体的选择还是要根据项目自身的属性来决定.这里只是列举出所有的可能接口.

  • 终于找到解决方案了,Qt的Model/View Framework解析 2012-07-28

    最近在看Qt的Model/View Framework,在网上搜了搜,好像中文的除了几篇翻译没有什么有价值的文章.E文的除了Qt的官方介绍,其它文章也很少.看到一个老外在blog中写道Model/View是他认为Qt中最不好的一部分了.真的是这样吗?为了回馈开源社区,我写了这篇blog,写的是我认为比较有价值的东东.题目起得是解析,但也没有特别细节的介绍,点到为止,有兴趣的Tx可以继续讨论.我所看的资料有<C++ GUI Programming with Qt 4, Second Edition

  • 顺利做好IP反向解析(PTR记录)的步骤分析 2013-10-31

    在垃圾邮件泛滥的今天,垃圾邮件给我们的生活.工作.学习带来了极大的危害.由于SMTP服务器之间缺乏有效的发送认证机制,即使采用了垃圾邮件识别阻拦技术效果仍旧一般,再者垃圾邮件识别阻拦技术主要是在收到信件后根据一定条件进行识别的,需要耗费大量服务器资源,如果能在信件到达服务器之前就采取一定手段,这样就能大大提高服务器效率了.因此,目前许多邮件服务器如sina.com,hotmail.com,yahoo.com.cn等等都采用了垃圾邮件识别阻拦技术+IP反向解析验证技术以更好的阻拦垃圾邮件. 我们先

  • Android开发之XML文件解析的使用 2014-06-17

    本篇文章介绍了,Android开发之XML文件解析的使用.需要的朋友参考下 前言 本文主要介绍在Android中怎样来解析XML文件.主要采用的是SAX机制,SAX全称为Simple API for XML,它既是一种接口,也是一个软件包.作为接口,SAX是事件驱动型XML解析的一个标准接口.XML文件解析一般有2种方法,DOM和SAX.其中DOM需要先将xml文档全部读入到电脑内存中,当文档内容太大时,该方法并不适用.SAX就比较好的解决了该问题,它是逐行解析的,可以随时中断.但是SAX的操作

  • Qt Model/View 学习笔记 (三) 2014-06-03

    清源游民 [email protected] Model类 基本概念 在model/view构架中,model为view和delegates使用数据提供了标准接口.在Qt中,标准接口QAbstractItemModel类中被定义.不管数据在底层以何种数据结构存储,QAabstractItemModel的子类会以层次结构的形式来表示数据,结构中包含了数据项表.我们按这种约定来访问model中的数据项,但这个约定不会对如何显示这些数据有任何限制.数据发生改变时,model通过信号槽机制来通知关联的v

  • 不愉快的 Qt 之旅 2014-06-22

    今天尝试用 Qt 来写一个小程序,从网上抓取一些东西,并解析一下保存到本地.很简单的功能,但是却写得非常不舒服. 大致看了一下 Qt 提供的库,似乎应有尽有了.一大堆 GUI Widget 可以构建丰富的界面,方便的 QHttp 可以用于下载 Web 页面,并使用 QRegExp 进行解析,还有 Qt 强大的 QTextCodec 可以在各种编码之间进行转换.并且 Qt 4 提供了 MCV 方式,让我能轻松地把事务和视图分开处理.一切都是那么完美,似乎是专门为我准备的一样.然而它们并不是为我准备

  • Qt中DOM的读写 2012-06-29

    对于一般的XML数据处理,Qt提供了QtXml模块.QXml模块提供了三种截然不同的应用程序编程接口用于读取XML文档: QXmlStreamReader 是一个用于读取格式良好的XML文档的快速解析器. DOM(文档对象模型)把XML文档转换为应用程序可以遍历的树形结构. SAX(XML简单应用程序编程接口)通过虚拟函数直接向应用程序报告"解析事件". 对于XML文件的写入,Qt也提供了三种可用的方法: 使用QXmlStreamWriter. 在内存中以DOM树的结构表示数据,并要求

  • 阅读Qt Creator--PluginDialog 和 PluginView分析 2012-07-10

    PluginView是插件管理器中所管理插件的可视化的查看类,派生自QWidget,可以作为任何QWidget的子类的子窗口. 方法列表及说明: 成员方法 说明 PluginSpec *currentPlugin() const QTreeWidgetItem中的UserRole里存放着相应的PluginSpec, 在parsePluginSpecs()中可以看到 QIcon iconForState(int state) 根据state所指插件状态返回一个Qicon ParsedNone =

  • [转]linux进程的内存使用解析 2013-03-04

    [转]linux进程的内存使用解析 转载自: http://pczou.bokee.com/5944730.html http://hi.baidu.com/shlongli/blog/item/5a244009ae1465cc3bc76322.html 进程的内存使用解析 进程XXX占用了多少内存?这是个经常被问到,也经常被答错的问题.Linux进程的内存分配是个比较复杂的话题,而Linux上的工具往往把这个问题过分简单化,因此引出不少误解和困惑.首先把ps, top这类工具扔掉,然后看这么一

  • Qt编译是,unicode文件格式会导致编译失败 2013-03-30

    最近编译一个Qt工程时总提示如下一个警告和链接错误.发现moc_mainwindow.cpp文件内容是空的,在命令行用moc mainwindow.h -o mainwindow.cpp提示一样,问题依旧. mainwindow.h(0): Note: No relevant classes found. No output generated. 1>mainwindow.obj : error LNK2001: 无法解析的外部符号 "public: virtual struct QMet

  • 嵌入式Qt方案中文显示系列:Qte中的字体支持和使用 2013-04-01

    前话:工作以来在项目中主要的开发工作都是用嵌入式QT开发界面,从一开始的从零摸索,到现在有点头绪和经验,很多东西和用法依然只是知其然,不知其所以然,甚至一些还仅仅是模仿阶段.在这期间,学的东西很零散,所以现在有一次做这块,打算弄明白一些东西,也算对自己付出的时间有个交待. 使用嵌入式Qt作为嵌入式GUI的解决方案,其实会比较轻松,除了几个不多的难点,就我目前的经验,一个是资源占用问题,对于资源紧张的系统优化会比较难,一个是中文显示的问题,这个也是我第一次花的时间很多的一块,网上这块的资料很多,说

  • Qt Embedded 键盘驱动分析(上) 2013-04-16

    为了保持QtEmbedded对硬件最小化的依赖程度,QtEmbedded所有硬件相关的操作都采用插件的封装形式,并且大部分功能都可以从程序外部运用环境变量的方式来配置.这样一来我们只要针对不同的硬件写好不同的插件,为不同硬件平台提供不同的启动脚本就可以了,换了硬件,代码却不需要修改. Qt Embedded的键盘操作是这种插件封装形式的典范,我们就以此为例,对Qt Embedded的硬件操作一窥究竟. 1.告诉QtEmbedded你需要哪个驱动 QWS_KEYBOARD这个环境变量就是你需要了解

  • QT加载muPDF静态库的问题和解决(导入C语言静态库,QT的运行时库设定) 2013-05-14

    首先下载muPDF,找到mupdf-1.2-source.zip下载解压. 进入win32目录,打开mupdf工程(vs2008及以上会提示转换,转换后自动产生.sln工程) 默认情况下没有v8引擎,v8版工程编不过,可以忽略. 确保mupdf.exe生成成功,可以测试一下效果. 制作一个QT动态库dll实现一些功能,包含头文件fitz.h 导入库libmupdf.lib .一切完事后编译发现所有使用到的函数都报LNK2001: unresolved external symbol 链接错误:未

  • 安装QT和C++开发环境 2013-07-06

    感谢Qt Project的伟大创造 QT提供了一套从桌面到平板到智能手机的完整开发环境.当看到下面的视频的时候,就感觉到该去学QT了. QT提供一套优质的C++库和一套优质的IDE环境. 安装QT有两个方式一个是在线安装一个是离线安装. 去下载页面 http://qt-project.org/downloads 在线安装,只需要下载Qt Online Installer for Windows程序包,然后安装提示即可.下载程序包用了几秒,但是天朝的网速让整个安装过程长达几个小时. 离线安装直接下

  • Linux上使用Qt Creator进行C/C++开发 2013-10-06

    Qt Creator支持中文,启动速度比Eclipse.Netbeans更快,界面也更美观,跟输入法Fcitx协作良好(光标跟随). 你既可以把Qt Creator当代码编辑器作为vim辅助,好处在于Qt Creator能够自动parse项目,形成友好快速的智能提示,而且你也同样可以使用Qt Creator里面的gdb前端(上图)和 对项目进行调试和内存分析,不过Makefile就要自己写或者用autotools生成了,这对于使用vim进行编程的同学来说,应该是轻车熟路的.差点忘了,连续按两次A

  • win上傻瓜化安装Qt开发环境 2014-02-27

    win上傻瓜化安装Qt开发环境 古老的MSYS搭建的开发环境不仅存在一些兼容性问题,而且还很繁琐,幸好mingw-build项目的开发者又做了更进一步的改进,他们开发了MSYS2项目.这个项目不仅兼容性更好,而且引入了包管理机制,可以直接从网上下载相关的软件,并解决相关的依赖性问题.这个项目的主页在 http://sourceforge.net/projects/msys2/ 进入项目主页后,根据你的系统选择32位或者64位,现在大家使用的系统应该都是64位的了.下载好base包,然后解压缩到什

  • Qt的多线程编程注意事项 2014-04-01

    QT总的来说是一个易学易用的库, 但是QT的多线程使用确实容易犯错,尤其是结合上异步的网络访问,谁用谁知道.我觉得核心是一句话,QThread要当作线程控制块用,不要以为派生一个QThread的子类,里面的东西都跑在新的线程里了,只有run()里的是这样. 下面这篇文章我觉得讲的很好,深入解析QT的线程用法,文章有点长,但是值得一读. 原文在 http://qt-project.org/wiki/ThreadsEventsQObjects 译文在 http://www.cppblog.com/b