c++ - qt中GUI同时更新和控制

标签 c++ multithreading qt user-interface

我正在尝试创建用于在 QT 中控制和监视工业机器的 GUI。 GUI 应每 300 毫秒更新一次来自机器的测量值。而且我应该可以同时控制机器。我正在做的(错误的)是我试图使用每 300 毫秒触发一次的计时器更新 GUI 中的测量值。但是,如果我在执行定时器槽的同时单击我的控制按钮,则 GUI 没有响应。我也尝试过使用信号和插槽技术。同样的结果。我无法在互联网上找到解决方案。如果有人能提供帮助,我会很高兴。提前致谢。

最佳答案

执行此操作有三种主要方法,每种方法各有优缺点。

简单、不可扩展的解决方案


最简单的方法是在您的“繁忙”代码中手动调用QApplication::processEvents()。例如,要在每个循环中手动更新 GUI,您可以这样做:

for (int i = 0; i < 5000; ++i) {
    label->setText(tr("At Index %1...").arg(i));
    QApplication::processEvents();
}

优点

  1. 非常简单
  2. 没有并发问题

缺点

  1. 功能非常有限
  2. 污染代码

线程

如果您想要一个简单但可扩展的解决方案,子类化 QThread 然后在单独的线程中运行非 GUI 任务是一个很好的方法:

class MyThread: QThread
{
    Q_OBJECT

    void run()
    {
        for (size_t i = 0; i < 50000; ++i) {
            std::cout << i << std::endl;
        }
    }
};

auto *thread = new MyThread;
thread->start();

当那个长任务发生时,GUI 会更新,Qt 会负责垃圾收集。


优点

  1. 相当简单
  2. 稳健、可扩展且信号/槽允许数据交换

缺点

  1. 不能从主线程以外的任何线程更新 GUI。
  2. 信号/槽必须使用 QueuedConnection。

事件循环

最后一种方法是 Qt 的原生解决方案:QEventLoop。

QTimer timer;
QEventLoop loop;

timer.setSingleShot(true);
connect(&timer, SIGNAL(timeout()), &loop, SLOT(quit()));

timer.start(5000); 
loop.exec();

这明显不那么直观,但在大多数情况下通过避免忙等待会好得多。


优点

  1. CPU 使用率最低

缺点

  1. 不太直观。

您可以阅读更多here .我最初有一个包含相同信息的现代资源,所以如果您在 Qt5 文档上找到类似的链接,请编辑这篇文章。

关于c++ - qt中GUI同时更新和控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45047432/

相关文章:

C++ 静态库链接器错误

java - JavaFX 应用程序线程中需要运行的方法列表?

C++ - 继承虚函数实现

python - 透明窗口,后面带有 pyqt 模糊

Java同步-不正确的发布

c++ - QT - 如何将小部件放置在互斥组中?

c++ - char a[n][m] 和 char a[][m] 有区别吗?

c++ - FFTW3、cuFFT 和就地变换

c++ - 为什么我的输出流段错误并且我的虚拟析构函数不起作用但是当我杀死虚拟时它会起作用

C++复制结构的内容