我正在使用一个库,我需要调用一个触发器函数来启动某些处理(启动一个执行该作业的线程)并立即返回。然后,当处理完成时,发出信号。
这需要根据不同的参数定期进行。由于在处理过程中不能对触发器函数进行其他调用,因此我需要以某种方式对它们进行排队。我想过使用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()
按照我的意愿做什么是正确的方法?
提前致谢。
答案 0 :(得分:1)
一个简单的解决方案是引入成员变量,例如bool m_isProcessing
,仅在m_isProcess == false
时开始处理,然后在开始处理时将其设置为true
并将其重置为{处理完成后{1}}。由于false
的插槽在GUI /主线程上执行,因此您无需担心计时器插槽与处理完成后将执行的插槽之间的同步。
如果要跟踪处理过程中发生的事件,可以使用相同的方法:将成员变量引入test QObject
类以跟踪所需的信息。
答案 1 :(得分:0)
您似乎正在寻找Qt::QueuedConnection。
Qt :: QueuedConnection 2当控制返回到接收者线程的事件循环时,将调用该槽。插槽在接收器的线程中执行。
因此,你可以这样写:
connect(&timer, SIGNAL(timeout()), SLOT(timerSlot()), Qt::QueuedConnection);
connect(&timer2, SIGNAL(timeout()), SLOT(timer2Slot()), Qt::QueuedConnection);
有关详细信息,您可以查看众所周知的mandelbrot示例如何在那里完成,尽管它使用的是工作线程: