1

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

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

感谢您的洞察力,

问候,Mystère 先生

4

4 回答 4

3

QObject::connect 的最后一个参数是连接类型,它决定了何时执行 slot。从文档中

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

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

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

  • Qt::BlockingQueuedConnection - 与 QueuedConnection 相同,除了当前线程阻塞直到槽返回。这种连接类型应该只用于发射器和接收器在不同线程中的情况。

于 2013-06-13T20:08:43.137 回答
2

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

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

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

于 2013-06-13T19:00:58.027 回答
2

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

如果您的计时器要在不同的线程中发出信号,则将在接收对象所属的线程中调用插槽。这意味着它将推迟到事件循环。(如您所见,让计时器在其自己的线程中运行无济于事。)

于 2013-06-13T19:41:50.590 回答
1

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

于 2013-06-13T19:47:34.443 回答