C++ QTimer的机理
假设C++ QTimer的机理,c++,qt,qtcore,qt-signals,qtimer,C++,Qt,Qtcore,Qt Signals,Qtimer,假设timer是QTimer的对象,计时器的间隔是iInterval,计时器的超时信号连接到插槽sltTimeout() 我在想,如果iInterval小于sltTimeout()运行所需的时间,会发生什么情况。结果会导致多个线程运行sltTimeout()?如果是这样的话,这可能会导致对对象的非同步访问出现问题 有人能澄清一下吗?一个QTimer在启动它的线程上运行。由于它只在一个线程上运行,因此在上一个插槽函数返回之前,它不可能多次发出其timeout()信号 从: Qt使用计时器的线程关联
timer
是QTimer
的对象,计时器的间隔是iInterval
,计时器的超时信号连接到插槽sltTimeout()
我在想,如果iInterval
小于sltTimeout()
运行所需的时间,会发生什么情况。结果会导致多个线程运行sltTimeout()
?如果是这样的话,这可能会导致对对象的非同步访问出现问题
有人能澄清一下吗?一个
QTimer
在启动它的线程上运行。由于它只在一个线程上运行,因此在上一个插槽函数返回之前,它不可能多次发出其timeout()
信号
从:
Qt使用计时器的线程关联来确定哪个线程将发出timeout()信号
QTimer
在启动它的线程上运行。由于它只在一个线程上运行,因此在上一个插槽函数返回之前,它不可能多次发出其timeout()
信号
从:
Qt使用计时器的线程关联来确定哪个线程将发出timeout()信号
结果会导致多个线程运行sltTimeout()吗
它不会自动运行,所以,不会。如果需要,您需要确保它是这样运行的,例如,如果它正在进行一些计算
如果是这样的话,这可能会导致对对象的非同步访问出现问题
是和否
在这种情况下没有什么特别的,只是一般的线程编程。您需要使用线程同步原语,如QMutex、QMutexLocker、QSemaphore等
您可以做的另一个技巧是在处理插槽时停止计时器调用,但这可能是您不希望采取的折衷方法
不要忘记,默认情况下事件将排队,因此,如果您在下一次运行中不依赖sltTimeout的上一次运行,您甚至可以忽略线程“如果您有足够的时间”来完成它。如果后续调用之间存在依赖关系,那么是的,您需要在代码方面变得聪明
结果会导致多个线程运行sltTimeout()吗
它不会自动运行,所以,不会。如果需要,您需要确保它是这样运行的,例如,如果它正在进行一些计算
如果是这样的话,这可能会导致对对象的非同步访问出现问题
是和否
在这种情况下没有什么特别的,只是一般的线程编程。您需要使用线程同步原语,如QMutex、QMutexLocker、QSemaphore等
您可以做的另一个技巧是在处理插槽时停止计时器调用,但这可能是您不希望采取的折衷方法
不要忘记,默认情况下事件将排队,因此,如果您在下一次运行中不依赖sltTimeout的上一次运行,您甚至可以忽略线程“如果您有足够的时间”来完成它。如果后续调用之间存在依赖关系,那么是的,您需要在代码方面变得聪明。我认为这不是OP所要求的。OP要求并行执行插槽(sltTimeout),而不是计时器本身。@GregHewgill我读到'Qt使用计时器的线程关联来确定哪个线程将发出超时()信号',但我没有得到它。现在我通过比较threadid来确认您的回答。@JandunCN:清楚这一点很重要。格雷格很幸运,在这里的想法和你一样,但你的问题不清楚,在我的解释中,它询问插槽并行运行的位置,而不是信号是否在不同的线程中发出。以后要记住这一点。如果它只是关于emit和slot的线程问题,我会说它是一个副本,但是基于当前的文本,我不敢这样标记它。我认为这不是OP要求的。OP要求并行执行插槽(sltTimeout),而不是计时器本身。@GregHewgill我读到'Qt使用计时器的线程关联来确定哪个线程将发出超时()信号',但我没有得到它。现在我通过比较threadid来确认您的回答。@JandunCN:清楚这一点很重要。格雷格很幸运,在这里的想法和你一样,但你的问题不清楚,在我的解释中,它询问插槽并行运行的位置,而不是信号是否在不同的线程中发出。以后要记住这一点。如果它只是关于emit和slot的线程问题,我会说它是一个副本,但基于当前文本,我不敢这样标记。实际上,我只是想知道signal发出的线程和sltTimeout()所在的线程运行是否相同。仍然感谢您给我有关同步编程的提示。@JandunCN:这不是您的问题所在。请以后再弄清楚。实际上,我只是想知道发出信号的线程和运行sltTimeout()的线程是否相同。同样感谢您给我有关同步编程的提示。@JandunCN:这不是您的问题所在。以后请尽量澄清。