我正在使用一个库,在这里我需要调用一个触发函数来启动一些处理(启动执行该任务的线程)并立即返回。然后,当处理完成时,将发出一个信号。

这需要根据不同的参数定期进行。由于在处理过程中不得执行对触发器函数的其他调用,因此需要以某种方式将它们排队。我考虑过要使用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()

什么是做我打算的正确方法?

提前致谢。

最佳答案

一种简单的解决方案是引入一个成员变量,例如bool m_isProcessing,仅在m_isProcess == false时开始处理,然后在开始处理时将其设置为true,并在处理完成时将其重置为false。由于test QObject的插槽是在GUI /主线程上执行的,因此您不必担心计时器插槽与处理完成后将执行的插槽之间的同步。

如果要跟踪处理期间发生的事件,可以使用相同的方法:将成员变量引入test类以跟踪所需的信息。

关于c++ - 将几个QTimers调用排队到插槽,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23313827/

10-12 23:57