首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将多个QTimers调用排队到时隙

将多个QTimers调用排队到时隙
EN

Stack Overflow用户
提问于 2014-04-26 16:43:23
回答 2查看 1.1K关注 0票数 1

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

这需要根据不同的参数定期进行。由于在处理过程中不能执行对触发器函数的其他调用,所以我需要以某种方式对它们进行排队。我考虑使用QEventLoop (“循环”),但到目前为止没有运气。

请看这段代码:

代码语言:javascript
复制
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()时,我得到消息:

代码语言:javascript
复制
QEventLoop::exec: instance xxxxxx has already called exec()

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

提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-30 01:43:25

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

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

票数 1
EN

Stack Overflow用户

发布于 2014-04-26 17:00:03

看起来你在找Qt::QueuedConnection

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

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

代码语言:javascript
复制
connect(&timer, SIGNAL(timeout()), SLOT(timerSlot()), Qt::QueuedConnection);
connect(&timer2, SIGNAL(timeout()), SLOT(timer2Slot()), Qt::QueuedConnection);

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

Mandelbrot示例

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23313827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档