c++ - 将多个 QTimers 调用排队到插槽

标签 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()

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

提前致谢。

最佳答案

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

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

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

相关文章:

linux - Qt串口通信使用UART RS232C

c++ - QT检测目录和子文件夹更改

c++ - QPainter 未激活

c++ - "Live"代码和使用 C++ 和 LLVM JIT 的快速原型(prototype)制作?

c++ - 在 C++ 中将 HWND 转换为十六进制字符串

c++ - 发送/接收套接字阻塞问题

php - QT5 : best efficiant way to "unserialise" array of keys/values from json result

python - 从字典创建 pyqtSignals

c++ - QThreads 中断槽和信号

c++ - 我们可以有多少级别的指针?