假设timer是QTimer的一个对象,计时器的间隔是iInterval,计时器的超时信号连接到时隙sltTimeout()。
我只是在想,如果iInterval小于运行sltTimeout()所需的时间,会发生什么情况。结果多个线程会运行sltTimeout()吗?如果是这样的话,这似乎会导致不同步访问对象的问题。
有人能澄清吗?
发布于 2014-05-20 03:39:06
QTimer运行在启动它的线程上。因为它只在一个线程上运行,所以它不可能在前一个插槽函数返回之前多次发出它的timeout()信号。
来自QTimer文档
Qt使用计时器的线程关联来确定哪个线程将发出timeout()信号。
发布于 2014-05-20 04:13:42
结果多个线程会运行sltTimeout()吗?
它不会自动运行,所以,不。如果需要的话,您需要确保这样做,例如,如果它正在做一些计算。
如果是这样的话,这似乎会导致不同步访问对象的问题。
是也不是。
在这种情况下,它没有什么特别之处,只是一般的线程编程。您需要使用线程同步原语,如QMutex、QMutexLocker、QSemaphore等。
您可以做的另一个技巧是,在处理时隙时停止计时器调用,但这样做会带来您可能不希望采取的折衷方案。
不要忘记默认情况下事件将排队,因此如果您在下一次运行中不依赖于您的sltTimeout的前一次运行,您甚至可以忽略线程“如果您有足够的时间”来完成它。如果后续调用之间存在依赖关系,那么是的,您需要在代码中变得聪明。
https://stackoverflow.com/questions/23750615
复制相似问题