假设timer
是 的一个对象QTimer
,定时器的时间间隔是iInterval
,定时器的超时信号连接到一个槽sltTimeout()
。
我只是在想如果iInterval
小于sltTimeout()
运行时间会发生什么。结果会运行多个线程sltTimeout()
吗?如果是这样,似乎可能会导致对对象的非同步访问出现问题。
谁能澄清一下?
假设timer
是 的一个对象QTimer
,定时器的时间间隔是iInterval
,定时器的超时信号连接到一个槽sltTimeout()
。
我只是在想如果iInterval
小于sltTimeout()
运行时间会发生什么。结果会运行多个线程sltTimeout()
吗?如果是这样,似乎可能会导致对对象的非同步访问出现问题。
谁能澄清一下?
AQTimer
在启动它的线程上运行。因为它只在一个线程上运行,所以它不可能timeout()
在前一个槽函数返回之前多次发出信号。
Qt 使用计时器的线程亲和性来确定哪个线程将发出 timeout() 信号。
多个线程会因此运行 sltTimeout() 吗?
它不会自动运行,所以,不。如果需要,您将需要确保它是这样完成的,例如,如果它正在做一些计算。
如果是这样,似乎可能会导致对对象的非同步访问出现问题。
是和不是。
在这种情况下没有什么特别的,只是一般的线程编程。您需要使用线程同步原语,如 QMutex、QMutexLocker、QSemaphore 等。
您可以做的另一个技巧是在处理插槽时停止计时器调用,但这有您可能不希望采取的妥协。
不要忘记默认情况下该事件将排队,因此如果您在下一次运行中不依赖 sltTimeout 的上一次运行,您甚至可以忽略线程“如果您有足够的时间”来完成它。如果后续调用之间存在依赖关系,那么是的,您需要在代码中变得聪明。