我正在开发一个对时间非常敏感的后续程序(基于延迟的视频流),因为我不确定如何在Qt内实现信号和插槽,我不知道何时他们被执行了。它们是真的像回调那样实时执行,还是在某种主循环的下一次迭代之前处理它们?
我的问题特别是关于定时器:当定时器超时(必须是另一个线程)时,它是否“瞬间”连接到信号(例如下一条指令),就像中断一样,或者是等待一些循环的结束?
感谢您的见解,
此致 Mystère先生
答案 0 :(得分:3)
QObject :: connect的最后一个参数是连接类型,它确定何时执行插槽。来自the documentation:
Qt :: AutoConnection - 如果信号是从与接收对象不同的线程发出的,则信号排队,表现为 Qt的:: QueuedConnection。否则,直接调用插槽, 表现为Qt :: DirectConnection。确定连接类型 当信号发出时。
Qt :: DirectConnection - 发出信号时立即调用插槽。
Qt :: QueuedConnection - 当控制权返回到接收者线程的事件循环时,将调用该槽。插槽在中执行 接收者的主题。
Qt :: BlockingQueuedConnection - 与QueuedConnection相同,但当前线程阻塞,直到插槽返回。这种连接类型 只应在发射器和接收器不同的地方使用 线程。
答案 1 :(得分:2)
答案 2 :(得分:2)
您可以确定计时器不是在不同的线程中实现,而是在事件循环内处理。这意味着当计时器触发时,它会立即连接。但是,计时器触发的粒度是您的主要问题。
如果您的计时器要在另一个线程中发出信号,则将在接收对象所属的线程中调用该槽。这意味着它将被推迟到事件循环。 (正如你所看到的那样,让计时器在它自己的一个线程中运行是没有用的。)
答案 3 :(得分:1)
此外,在Qt5中,您可以设置QTimer的精度:Qt::TimerType