1

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

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

做我想做的事情的正确方法是什么?

提前致谢。

4

2 回答 2

1

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

如果你想跟踪处理过程中发生的事件,你可以使用相同的方法:在test类中引入一个成员变量来跟踪你需要的信息。

于 2014-04-30T01:43:25.167 回答
0

看来您正在寻找Qt::QueuedConnection

Qt::QueuedConnection 2 当控制返回接收者线程的事件循环时调用该槽。插槽在接收者的线程中执行。

因此,您可以编写如下内容:

connect(&timer, SIGNAL(timeout()), SLOT(timerSlot()), Qt::QueuedConnection);
connect(&timer2, SIGNAL(timeout()), SLOT(timer2Slot()), Qt::QueuedConnection);

有关详细信息,您可以查看著名的 mandelbrot 示例,尽管它使用的是工作线程:

曼德布洛特示例

于 2014-04-26T17:00:03.357 回答