【发布时间】:2019-09-22 13:17:15
【问题描述】:
我设法在 worker C++ std::thread 中实现了一个基于 GUI Qt 的应用程序,如 here 所述。现在我需要主线程和工作线程进行通信。
我的问题是:如何将消息(浮点数数组)从主线程传递到工作线程,以便更新 GUI?
我有一个执行实时信号处理的应用程序。我的目标是创建一个可以插入到我的应用程序中的 Qt GUI,以在不影响实时方面的情况下可视化各种信号。我研究了如何实现这一目标的不同方法,并得出结论,这个post 非常详细地描述了我的需求并为它提供了解决方案。但是,没有关于主线程和工作线程如何相互通信的信息。
我尝试使用here 描述的 Futures/Promises 方法来完成线程间通信。虽然我能够运行这个示例,但我无法将它集成到我的项目中。原因是这种方法依赖于工作线程内部的繁忙循环,该循环不断检查主线程是否已发送新消息。但是,在 Qt 应用程序中,一旦进入a.exec() 中的主事件循环,程序就会阻塞。这可以防止繁忙的循环检查,从而导致程序死锁。
这就是我生成 GUI 工作线程的方式(基于 this 帖子)。
#include <thread>
// Start the Qt realtime plot demo in a worker thread
int argc = 0;
char **argv = NULL;
std::thread t1
(
[&] {
QApplication application(argc, argv);
MainWindow mainWindow;
mainWindow.show();
return application.exec();
}
);
【问题讨论】:
-
通信需要如何进行?具有适当同步的共享内存应该足够了。我看不到任何与您在代码中描述的内容相关的内容。
-
我对通讯的工作方式没有要求。我没有研究过共享内存通信,但如果你认为这可以帮助我完成我需要的事情,我会研究它。所以让我们假设我启动了 GUI 工作线程(使用我发布的代码)。该线程将进入
application.exec()并且永远不会返回。如何使用共享内存方法将消息从我的主线程发送到工作线程,以便它使用消息更新 GUI?我是否需要信号/槽机制来通知 GUI 工作线程有新消息可用? -
您应该能够通过使用
Qt::QueuedConnection连接类型调用QMetaObject::invokeMethod来通知UI 线程。这基本上将一个事件发布到 Qt 的事件队列中。 -
@IgorTandetnik 如果在 UI 线程中定义了
mainWindow,我如何以mainWindow作为参数调用QMetaObject::invokeMethod? -
谢谢伊戈尔。这绝对是解决问题的一种方法。看看@ypnos 的答案。它提供了一些关于为什么这可能是或可能不是最佳解决方案的见解。
标签: c++ multithreading qt c++11 qt5