C++ 在qt中同时更新和控制GUI

C++ 在qt中同时更新和控制GUI,c++,multithreading,qt,user-interface,C++,Multithreading,Qt,User Interface,我正在尝试创建一个GUI,用于控制和监视QT中的工业机器。GUI应每300ms更新一次机器的测量值。我应该能同时控制机器。我所做的(错误的)是,我试图使用每300ms触发一次的计时器来更新GUI中的测量值。但是,如果在执行计时器插槽的同时单击控制按钮,GUI将没有响应。我也尝试过使用信号和插槽技术。同样的结果。我无法在互联网上找到解决方案。如果有人能帮忙,我会很高兴的。提前感谢。有三种主要的方法可以做到这一点,每种方法都有各自的优点和缺点 简单、不可扩展的解决方案 最简单的方法是在“繁忙”代码

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

有三种主要的方法可以做到这一点,每种方法都有各自的优点和缺点

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


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

for (int i = 0; i < 5000; ++i) {
    label->setText(tr("At Index %1...").arg(i));
    QApplication::processEvents();
}
这基本上不那么直观,但在大多数情况下,通过避免繁忙的等待,这恰好要好得多


专业人士

  • 最小CPU使用率
  • 缺点

  • 不那么直观

  • 你可以读更多。我最初有一个具有相同信息的现代资源,因此如果您在Qt5文档中找到类似的链接,请编辑此帖子。

    我发现了问题所在。这不是我想的那样。我正在请求每30毫秒与之通信的机器的状态。我把它增加到3000毫秒,现在可以了。即使在执行另一个插槽时单击该按钮,也不会导致任何问题。这是一件愚蠢的事。谢谢大家的帮助。所有的答案都很有启发性。再次感谢。

    您能分享一下您的代码吗?你在代码中使用了Sleep命令吗?你能分享你的代码吗?在大多数情况下,定时器是正确的方式。如果点击没有执行,这可能是代码中的一些问题,可能是一些阻塞功能,您可以使用信号/插槽或线程重新排列。谢谢您的回复。那么你是说即使我在定时器被触发时点击按钮也不会引起任何问题?我明天会把代码发出去。。谢谢,在我的代码中不要使用sleep命令。
    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();
    
    QTimer timer;
    QEventLoop loop;
    
    timer.setSingleShot(true);
    connect(&timer, SIGNAL(timeout()), &loop, SLOT(quit()));
    
    timer.start(5000); 
    loop.exec();