QTimer的机制

时间:2014-05-20 03:35:11

标签: c++ qt qtcore qt-signals qtimer

假设timerQTimer的对象,计时器的间隔为iInterval,并且计时器的超时信号连接到一个插槽{{1} }。

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

有人可以澄清吗?

2 个答案:

答案 0 :(得分:6)

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

来自QTimer documentation

  

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

答案 1 :(得分:0)

  

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

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

  

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

是和否。

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

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

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