通过直接连接或排队连接调用插槽的QTimer超时插槽有什么区别?

时间:2016-06-16 06:22:26

标签: c++ qt qtimer qapplication

我问的是在事件引擎中有很多qt事件排队的情况。 QTimer是否会通过事件发出timeout()信号,并且queuedConnection会在一个广告位中创建另一个事件吗?

3 个答案:

答案 0 :(得分:3)

Qt::DirectConnection发出QTimer::timeout信号时,将立即调用与QTimer连接的广告位。如果使用排队连接,它将安排一个事件来调用插槽,该插槽将由事件循环处理。 QTimer使用timerEventemit the timeout signal

答案 1 :(得分:1)

默认情况下,它不是排队连接,除非它在不同的线程中运行。因此它是DirectConnection。

我想说,一般来说,如果你想保证事件的顺序顺序,你最好将Qt :: QueuedConnection与定时器之类的东西一起使用,即使在同一个线程中也是如此,以便事件进入队列并且是不仅仅是对immidiatley采取行动 - 因为这种行为是某种 - 更像是一种“中断”。

但是,如果你真的希望立即对timer timeout()进行操作,那么使用Qt :: DirectConnection - 我觉得你需要更加小心这种连接类型(比如定时器可以在中间的其他正常代码)。

修改

“普通代码”是指......好吧,请看下面的评论:

答案 2 :(得分:0)

当QTimer超时时,将每个QTimer的信号与插槽连接起来的每个信号槽连接都会激发此插槽一次。