找回密码
 立即注册

QTimer 在connect timeout 信号和槽时, Qt::ConnectionType type 参数...

发表于 2017-9-13 18:26:30 | 显示全部楼层 |阅读模式
40Qter豆
本帖最后由 another_qt 于 2017-9-13 18:30 编辑

各位大侠,想请问下,在GUI线程里使用定时器QTimer时;其connect方式不同如下:
      connect( timer, SIGNAL(timeout()), this, SLOT(updateUI()) ,Qt::QueuedConnection);
和 connect( timer, SIGNAL(timeout()), this, SLOT(updateUI()),  Qt::DirectConnection);
这两者的区别是什么?
我的理解是,
第一种方式,当超时信号到达时,updateUI 会被放入gui线程的事件循环里,等程序返回事件循环时才真正去执行updateUI ;
第二种方式,当超时信号到达时,updateUI 会直接被调用;
不知道这样的理解是否有误?请大家指正
如果是这样理解的话,那是不是跟使用 QBasicTimer 里然后重载  QObject::timerEvent() 差不多了?只是可能 QBasicTimer 的效率会更高些。

最佳答案

查看完整内容

你可以试一试啊,其实实际效果是这样的: 就是排队执行,,比如说,当前程序在执行一个方法,这个方法还没执行完,信号就来到了,这个时候有个问题:是执行完当前的方法再去执行该信号对应的槽函数呢?还是立马去执行槽函数呢? 1.Queued 是 “执行完当前的方法再去执行该信号对应的槽函数” 2.Direct 是 “立马去执行槽函数” 等到槽函数执行完了,再去执行那个“未执行完的方法”。。。 这样解释清楚吗? ...
回复

使用道具 举报

发表于 2017-9-13 18:26:31 | 显示全部楼层
你可以试一试啊,其实实际效果是这样的:

就是排队执行,,比如说,当前程序在执行一个方法,这个方法还没执行完,信号就来到了,这个时候有个问题:是执行完当前的方法再去执行该信号对应的槽函数呢?还是立马去执行槽函数呢?

1.Queued 是 “执行完当前的方法再去执行该信号对应的槽函数”
2.Direct 是 “立马去执行槽函数” 等到槽函数执行完了,再去执行那个“未执行完的方法”。。。

这样解释清楚吗?

点评

非常清楚;多谢 。那么第二个问题能否继续解答下?QBasicTimer 类重载 TimerEvent ,我看了下 QOject::event的源码,似乎 QBasicTimer 类触发的 TimerEvent 事件是放到QT的事件循环里处理的?  详情 回复 发表于 2017-9-14 23:01
回复

使用道具 举报

发表于 2017-9-14 20:37:15 | 显示全部楼层
看着这么多豆子,我却无能为力,着实让人生气
回复

使用道具 举报

 楼主| 发表于 2017-9-14 23:01:48 | 显示全部楼层
qq1043068972 发表于 2017-9-13 20:22
你可以试一试啊,其实实际效果是这样的:

就是排队执行,,比如说,当前程序在执行一个方法,这个方法还没 ...

非常清楚;多谢 。那么第二个问题能否继续解答下?QBasicTimer 类重载 TimerEvent ,我看了下 QOject::event的源码,似乎 QBasicTimer  类触发的 TimerEvent 事件是放到QT的事件循环里处理的?
回复

使用道具 举报

发表于 2017-9-15 17:13:45 | 显示全部楼层
这个也是信号触发吧,信号的话,都是放到那个事件循环处理的吧,,main.cpp里的return app.exec()就是启动这个循环线程的,,我是感觉是这样,这个不是很确定哈。。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

another_qt

    主题

    帖子

    141

    积分

    Qter2级会员

    Rank: 2

    积分
    141

Qter2级会员

发私信

Qt开源社区——开源 共享 自由

微信扫一扫
查看精品教程!