0

假设timer是 的一个对象QTimer,定时器的时间间隔是iInterval,定时器的超时信号连接到一个槽sltTimeout()

我只是在想如果iInterval小于sltTimeout()运行时间会发生什么。结果会运行多个线程sltTimeout()吗?如果是这样,似乎可能会导致对对象的非同步访问出现问题。

谁能澄清一下?

4

2 回答 2

6

AQTimer在启动它的线程上运行。因为它只在一个线程上运行,所以它不可能timeout()在前一个槽函数返回之前多次发出信号。

QTimer 文档

Qt 使用计时器的线程亲和性来确定哪个线程将发出 timeout() 信号。

于 2014-05-20T03:39:06.750 回答
0

多个线程会因此运行 sltTimeout() 吗?

它不会自动运行,所以,不。如果需要,您将需要确保它是这样完成的,例如,如果它正在做一些计算。

如果是这样,似乎可能会导致对对象的非同步访问出现问题。

是和不是。

在这种情况下没有什么特别的,只是一般的线程编程。您需要使用线程同步原语,如 QMutex、QMutexLocker、QSemaphore 等。

您可以做的另一个技巧是在处理插槽时停止计时器调用,但这有您可能不希望采取的妥协。

不要忘记默认情况下该事件将排队,因此如果您在下一次运行中不依赖 sltTimeout 的上一次运行,您甚至可以忽略线程“如果您有足够的时间”来完成它。如果后续调用之间存在依赖关系,那么是的,您需要在代码中变得聪明。

于 2014-05-20T04:13:42.390 回答