将几个QTimers呼叫排队到插槽

时间:2014-04-26 16:43:24

标签: c++ qt qt-signals qtimer qeventloop

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

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

按照我的意愿做什么是正确的方法?

提前致谢。

2 个答案:

答案 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示例如何在那里完成,尽管它使用的是工作线程:

Mandelbrot Example