gpt4 book ai didi

Qt主事件队列阻塞时的QTimer超时处理

转载 作者:行者123 更新时间:2023-12-04 19:58:27 25 4
gpt4 key购买 nike

如果我定期启动 QTimer 触发,但响应超时信号的插槽阻塞主循环的时间长于另一个计时器间隔,会发生什么情况。超时信号是否会被堆叠在 Qt 主事件循环上,并在事件循环再次运行时一个接一个地处理?

如果是,如果多个超时事件堆叠在事件队列中,但在处理它们之前计时器已停用,会发生什么情况?

最佳答案

QTimer对象和信号接收器属于一个线程,不会发生排队。 timeout()在控制流进入事件循环之前,不会(也不能)再次发送信号,并且在插槽完全执行之前不会发生这种情况(除非在插槽中调用 QApplication::processEvents,这会使这变得一团糟) .但是,如果您的插槽执行时间长于计时器的时间间隔,timeout()将在事件循环空闲时发送,因此您的插槽将立即再次被调用。但是QTimer不会发两个timeout()信号比其间隔更近。

QTimer在另一个线程中,并且该线程不忙于其他事情,它将发送 timeout()无论另一个线程中的插槽运行情况如何,都会定期发出信号。这就是 Qt 的信号槽系统的用武之地。它会将发出的信号排入队列。如果您的插槽很慢,它会毫不拖延地多次调用它。如果您停止计时器,它不会撤消已经发送的信号,并且该槽可能会在它之后被多次调用。此外,如果您停止计时器,则始终有可能此时正在发送另一个信号,您的插槽将再次被调用。

如果您希望槽调用之间有严格的间隔而不管槽的执行时间,您应该使用单次定时器。在您的插槽结束时,启动单次计时器。当它超时时,它会调用您的插槽并停用,因此您可以在插槽末尾再次启动它。

如果您的程序逻辑取决于计时器的状态,您应该检查计时器在您的插槽开始时是否处于事件状态。不能保证在执行插槽时计时器处于事件状态。

关于Qt主事件队列阻塞时的QTimer超时处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31056276/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com