Qt线程和signal-slot

Qt事件和信号的区别

问题:什么时候用事件,什么时候用信号呢?是不是不同的线程间用事件,信号不能用在线程间?

解答

仔细来看,事件与信号其实并无多大差别,从我们对其需求上来说,都只要能注册事件或信号响应函数,在事件或信号产生时能够被通知到即可。但有一项区别在于,事件处理函数的返回值是有意义的,我们要根据这个返回值来确定是否还要继续事件的处理,比如在Qt中,事件处理函数如果返回true,则这个事件处理已完成,QApplication会接着处理下一个事件,而如果返回false,那么事件分派函数会继续向上寻找下一个可以处理该事件的注册方法。信号处理函数的返回值对信号分派器来说是无意义的。

另外还有一个需要我们关注的问题是事件和信号处理时的优先级问题。在Qt中,事件因为都是与窗口相关的,所以事件回调时都是从当前窗口开始,一级一级向上派发,直到有一个窗口返回true,截断了事件的处理为止。对于信号的处理则比较简单,默认是没有顺序的,如果需要明确的顺序,可以在信号注册时显示地指明槽的位置。

在Qt中,事件使用了一个事件队列来维护,如果事件的处理中又产生了新的事件,那么新的事件会加入到队列尾,直到当前事件处理完毕后,QApplication再去队列头取下一个事件来处理。而信号的处理方式有些不同,信号处理是立即回调的,也就是一个信号产生后,他上面所注册的所有槽 都会立即被回调。这样就会产生一个递归调用的问题,比如某个信号处理器中又产生了一个信号,会使得信号的处理像一棵树一样的展开。

评价:实际上信号-槽也可以异步的,这个bool connect ( const QObject * sender, const char * signal, const QObject * receiver, const char * method, Qt::ConnectionType type = Qt::AutoCompatConnection )

里面的Qt::AutoCompatConnection,可以根据实际情况确定。

一个问题:Qt里用线程,主线程是GUI,次线程是工作线程,如果次线程里也用消息循环(exec),即,主/次间用signal-slot通讯来实现同步,在这种情况下:

1. 主线程会被次线程block吗?

2. 如果在单cpu里会被block吗,如果次线程里不断循环,低层会自动分配时间片给主线程吗?

3. 这种方法和直接调用次线程中的方法,用mutex之类的来实现类似的循环,效率差别大吗?记得QT里讲过signal-slot只是多几个函数调用的差别。主次线程中怎样通讯比较有效?

QThread 现在默认状态下就是有一个消息循环的,而且鼓励使用线程独立的消息循环:

1.主线程会被次线程block吗?不会,QObject::connectd的最后一个参数(http://doc.qt.nokia.com/4.6/qt.html#ConnectionType-enum) 默认使用Qt::AutoConnection, 在多线程环境下,会自动选择Qt::QueuedConnection方式,除非强制使用Qt::BlockingQueuedConnection或者 Qt::DirectConnection, 否则线程不会block。

2. 如果在单cpu里会被block吗,如果次线程里不断循环,低层会自动分配时间片给主线程吗?线程和CPU个数没有关系,当然CPU多了,运行会更加流程,线程的资源分配(时间片)是由操作系统管理的,在各个系统上都是如此。

3. 这种方法和直接调用次线程中的方法,用mutex之类的来实现类似的循环,效率差别大吗? 执行效率上很难讲,但是mutex肯定是带来了开发效率的降低,你得小心翼翼地处理好各种临界资源的锁问题。

4. 记得QT里讲过signal-slot只是多几个函数调用的差别 是的,signal-slot的这种轻微的效率损失在绝大多数情况下不是问题,除非过度使用,这一般是设计上的错误导致的。

Qt线程和signal-slot相关推荐

  1. qt中emit signal slot

    qt中emit signal slot qt中的类库有很多都是从QObject上继承下来的, 信号与反应槽(signals/slot)机制就是用来在QObject类或其子类之间通信的一种方法.作为一种 ...

  2. Qt线程间信号槽传递自定义数据类型(qRegisterMetaType的使用)

    Qt线程间信号槽传递自定义数据类型(qRegisterMetaType的使用) #include <QMetaType> CFileDataModel::CFileDataModel(QO ...

  3. QT入门语法——signal,slot

    . Qt 5 Alpha 已经发布.我们会在后面的文章中看到 Qt 5 的新变化.今天,我们先来看一下 Qt 5 带来的一个最主要的变化:signal/slot 机制的改变. Qt 5 之前的语法 在 ...

  4. Qt signal slot 实现机制

    今天被问到一个问题,如下:Qt的signal slot的实现机制. 现在整理一下: 概述 信号和槽机制是QT的核心机制,要精通QT编程就必须对信号和槽有所了解.信号和槽是一种高级接口,应用于对象之间的 ...

  5. QT信号(signal)和槽(slot)问题

    QT信号(signal)和槽(slot)问题 信号与槽机制是比较灵活的,但有些局限性我们必须了解,这样在实际的使用过程中做到有的放矢,避免产生一些错误.下面就介绍一下这方面的情况. 1.信号与槽的效率 ...

  6. QT线程 Emit、Sgnals、Slot详细解释

    本文详细的介绍了QT中如何发送信号.如何接收信号.Emit.Sgnals.Slot的具体使用方法.信号和槽机制是 QT 的核心机制,要精通 QT 编程就必须对信号和槽有所了解.信号和槽是一种高级接口, ...

  7. QT线程使用收集示例

    关于多线程问题: Qt和Boost做跨平台的线程封装,OpenMP主要做并行计算,让不精通多线程的人也能高效地利用CPU的计算能力. 个人倾向于用boost.thread, boost.mpi.   ...

  8. qt 线程接收线程 moveToThread 特性

    qt 线程槽函数 假定一个线程继承QThread,那么这个线程的槽函数接收信号启动后,是在线程里执行否,答案并不是,只有run 函数才是执行在线程中的,要让槽函数执行在线程中,必须使用qt moveT ...

  9. Qt线程、事件与QObject

    线程.事件与QObject 敬告:测试版本 原文连接:http://m.blog.csdn.net/blog/shang322/9344475# 本译文接近定稿,但还须一些加工和更好的例子.欢迎任何评 ...

  10. QT线程同步与异步处理

    平时我们使用线程的时候一般是继承QThread类,实现它的run()函数,将需要在线程中执行的代码放在run()里进行执行.需要注意的事项:如果是while循环,想要结束线程,调用QThread::q ...

最新文章

  1. Mysql数据库 sql 语句调优
  2. SQL Server调优系列玩转篇(如何利用查询提示(Hint)引导语句运行)
  3. 用python做双人五子棋_基于python的socket实现单机五子棋到双人对战
  4. 一文理解Netty模型架构
  5. 定义一个函数模板,要求返回两个值中的较小值。
  6. python科学计算包与matlab_做科学计算用Python还是MATLAB?
  7. 下周递交上市申请,腾讯持股的微医投资价值几何?
  8. 市场调研报告-工业固体废物管理市场现状及未来发展趋势
  9. Numerical analysis second editon Timothy sauer 书附代码
  10. ip rule 路由策略数据库管理命令
  11. Solved - Safari keeps forcing HTTPS on localhost
  12. SPU和SKU有什么区别
  13. 机器学习训练素材_广告素材在编码训练营中导航的5条提示
  14. python 数列筛选_numpy ndarray 按条件筛选数组,关联筛选的例子
  15. 微信小游戏《海盗来了》测评
  16. 毕业晚会主题八个字计算机学院,毕业主题标语8个字
  17. php获取真实客户端IP方法
  18. Windows Phone : 三屏一云战略的新里程碑
  19. 无线节点的空中唤醒技术解析
  20. python股票数据分析_用Python进行股票数据分析

热门文章

  1. Linux 命令(95)—— test 命令
  2. Linux 命令(56)—— telnet 命令
  3. 场景7:带有Linux网桥的提供商网络
  4. 记录一下所了解的一些第三开源框架
  5. Spring 与 Hibernate 集成 Transactional设置为只读
  6. .NET 垃圾回收与内存泄漏
  7. 涉众分析与硬数据采样(第六章)
  8. npm和package.json那些不为常人所知的小秘密
  9. canvas绘制视频封面
  10. 史上最全面的程序员招聘建议