【发布时间】:2014-04-26 16:43:23
【问题描述】:
我正在使用一个库,我需要在其中调用一个触发器函数,该函数开始一些处理(启动一个执行该工作的线程)并立即返回。然后当处理完成时会发出一个信号。
这需要根据不同的参数定期进行。由于在处理过程中不能对触发函数进行其他调用,因此我需要以某种方式将它们排队。我考虑过使用 QEventLoop(“循环”),但到目前为止没有运气。
请看这段代码:
test::test()
{
connect(&timer, SIGNAL(timeout()), this, SLOT(timerSlot()));
connect(&timer2, SIGNAL(timeout()), this, SLOT(timer2Slot()));
connect(&library, SIGNAL(processingFinished()), &loop, SLOT(quit()));
timer.setInterval(2000);
timer.start();
timer2.setInterval(4000);
timer2.start();
}
void test::timerSlot()
{
loop.exec();
startProcessing(some_parameters);
}
void test::timer2Slot()
{
loop.exec();
startProcessing(some_other_parameters);
}
问题是在处理过程中调用 loop.exec() 时,我会收到消息:
QEventLoop::exec: instance xxxxxx has already called exec()
什么是做我想做的事情的正确方法?
提前致谢。
【问题讨论】:
-
如果您想在处理参数时阻止定时器槽执行,您可以让定时器槽断开信号槽连接,并在处理完成后重新连接。但是,这不会“排队”处理期间发生的其他计时器事件。您能解释一下通过排队计时器事件来实现的目标吗?您是否希望所有排队的计时器事件在处理完成后立即执行?
-
您好@deGoot,感谢您的回答!这是一个服务器-客户端模型。我需要定期轮询客户端以更新服务器上的信息。每 x 秒应该发生不同类型的轮询。我对排队所有未决的民意调查不感兴趣,但至少如果两个同时发生或在前一个民意调查正在进行时,我想在第一次完成后执行最后一个。关于您的建议,我认为这可能会对轮询周期产生重大影响,因为计时器将每 x 秒调用一次 slot 以及中间的所有“暂停”。
-
在这种情况下,您可以只使用成员
bool m_is Processing变量并将计时器代码包装在if(!m_isProcessing)中。您还可以有一个成员变量来指示在您处理时是否有另一个计时器关闭。并在处理完成后重置 m_isProcessing 并启动其他计时器的操作。 -
谢谢@deGoot!你的解决方案是一个非常简单的解决方案,如此简单以至于我没有想到,在考虑复杂的替代方案之前我无法弄清楚。它解决了我的问题。如果您想发布答案,我很乐意将其设置为已接受。
-
很高兴我的建议对您有用。我知道当您认为自己正在处理一个复杂的问题时,错过一个简单的解决方案是什么感觉。
标签: c++ qt qt-signals qtimer qeventloop