什么时候在Qt中处理插槽?

时间:2013-06-13 18:47:31

标签: qt signals-slots

我正在开发一个对时间非常敏感的后续程序(基于延迟的视频流),因为我不确定如何在Qt内实现信号和插槽,我不知道何时他们被执行了。它们是真的像回调那样实时执行,还是在某种主循环的下一次迭代之前处理它们?

我的问题特别是关于定时器:当定时器超时(必须是另一个线程)时,它是否“瞬间”连接到信号(例如下一条指令),就像中断一样,或者是等待一些循环的结束?

感谢您的见解,

此致 Mystère先生

4 个答案:

答案 0 :(得分:3)

QObject :: connect的最后一个参数是连接类型,它确定何时执行插槽。来自the documentation

  
      
  • Qt :: AutoConnection - 如果信号是从与接收对象不同的线程发出的,则信号排队,表现为   Qt的:: QueuedConnection。否则,直接调用插槽,   表现为Qt :: DirectConnection。确定连接类型   当信号发出时。

  •   
  • Qt :: DirectConnection - 发出信号时立即调用插槽。

  •   
  • Qt :: QueuedConnection - 当控制权返回到接收者线程的事件循环时,将调用该槽。插槽在中执行   接收者的主题。

  •   
  • Qt :: BlockingQueuedConnection - 与QueuedConnection相同,但当前线程阻塞,直到插槽返回。这种连接类型   只应在发射器和接收器不同的地方使用   线程。

  •   

答案 1 :(得分:2)

http://woboq.com/blog/how-qt-signals-slots-work.html

这似乎是一个很好的描述,虽然我没有详细阅读。

要点:有直接连接和延迟连接。直接连接立即执行。

答案 2 :(得分:2)

您可以确定计时器不是在不同的线程中实现,而是在事件循环内处理。这意味着当计时器触发时,它会立即连接。但是,计时器触发的粒度是您的主要问题。

如果您的计时器要在另一个线程中发出信号,则将在接收对象所属的线程中调用该槽。这意味着它将被推迟到事件循环。 (正如你所看到的那样,让计时器在它自己的一个线程中运行是没有用的。)

答案 3 :(得分:1)

此外,在Qt5中,您可以设置QTimer的精度:Qt::TimerType