通过直接连接或排队连接调用插槽的 QTimer 超时插槽有什么区别?
What is difference between QTimer timeout slot calling a slot through direct connection or queued connection?
我问的是事件引擎中有很多 qt 事件排队的情况。 QTimer
是否会通过事件发出 timeout()
信号,并会与 queuedConnection
一起创建另一个事件?
当 QTimer 超时时,将此 QTimer 的信号与一个槽连接的每个信号槽连接都恰好触发该槽一次。
当QTimer
发出QTimer::timeout
信号时,与Qt::DirectConnection
连接的槽将被立即调用。如果您使用排队连接,它将安排一个事件来调用插槽,该事件将由事件循环处理。 QTimer
使用 timerEvent
to emit the timeout
signal.
不,默认情况下它不排队连接,除非它是 运行 在不同的线程中。因此它是 DirectConnection。
我想说的是,一般来说,如果你想保证事件的顺序,你最好将 Qt::QueuedConnection 与计时器之类的东西一起使用,即使在同一个线程中也是如此,这样事件就会进入排队并且不只是立即采取行动 - 因为这种行为有点像 "interrupt".
但是,如果您真的希望定时器 timeout() 立即生效,那么请使用 Qt::DirectConnection - 我觉得您通常需要更加小心这种连接类型(定时器之类的东西可以在其他正常代码中间触发)。
编辑
"normal code" 我的意思是......好吧,请看下面的评论:
我问的是事件引擎中有很多 qt 事件排队的情况。 QTimer
是否会通过事件发出 timeout()
信号,并会与 queuedConnection
一起创建另一个事件?
当 QTimer 超时时,将此 QTimer 的信号与一个槽连接的每个信号槽连接都恰好触发该槽一次。
当QTimer
发出QTimer::timeout
信号时,与Qt::DirectConnection
连接的槽将被立即调用。如果您使用排队连接,它将安排一个事件来调用插槽,该事件将由事件循环处理。 QTimer
使用 timerEvent
to emit the timeout
signal.
不,默认情况下它不排队连接,除非它是 运行 在不同的线程中。因此它是 DirectConnection。
我想说的是,一般来说,如果你想保证事件的顺序,你最好将 Qt::QueuedConnection 与计时器之类的东西一起使用,即使在同一个线程中也是如此,这样事件就会进入排队并且不只是立即采取行动 - 因为这种行为有点像 "interrupt".
但是,如果您真的希望定时器 timeout() 立即生效,那么请使用 Qt::DirectConnection - 我觉得您通常需要更加小心这种连接类型(定时器之类的东西可以在其他正常代码中间触发)。
编辑
"normal code" 我的意思是......好吧,请看下面的评论: