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