Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QTimer的机理_C++_Qt_Qtcore_Qt Signals_Qtimer - Fatal编程技术网

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:这不是您的问题所在。以后请尽量澄清。