c++ - Qt 线程计算输出到 GUI 中的自己的小部件?

标签 c++ multithreading qt widget

基本上,我正在操作的这个程序使用 Qt 中的线程来使用指定数量的线程(最多 4 个线程)查找指定范围内的所有质数。

每个线程都必须输出它在自己的某种 GUI 小部件中找到的素数。

在编写当前代码时,我跳过了很多基础知识,但到目前为止,它完成了我上面提到的所有事情,除了将数据输出到小部件并将每个线程的数据分离到它自己的小部件中。

所以我的问题是.. 我应该为每个线程的输出使用哪个小部件?文本小部件/列表小部件等?以及通常如何将每个线程的“计算”分开,以便我可以将每个线程输出到它自己的小部件?

最佳答案

主线程以外的线程不允许直接调用 GUI 小部件对象上的方法,因为这不是线程安全的(因为主 GUI 线程也可能随时调用小部件上的方法,例如当窗口大小改变时重新绘制它们)。

因此,您的计算线程需要向主线程发送一条消息,要求它代表它们更新小部件。

通常,最简单的方法是让计算线程发出一个包含您要显示的数据的信号(例如作为 QString),然后通过 QueuedConnection connect() 该信号到适当的小部件的 setText() 插槽(或到将更新小部件的其他一些适当的插槽)。

另一种可能的方法是让您的小部件线程调用 QApplication::postEvent(theTargetWidget, new MyEventType(myResultData))。在这种情况下,MyEventType 将是您自己的 QEvent 子类,其中包含您要发送到主/GUI 线程的数据。然后你会确保 (theTargetWidget) 也是你的子类,你已经覆盖了“bool event(QEvent *)”方法来检查 MyEventType 的传入事件,从中提取数据,并更新小部件它。每次您的计算线程调用 postEvent() 时,Qt 都会确保在主/GUI 线程中尽快调用 event()。

一旦您安全地设置了线程间消息传递(通过上述两种方法中的任何一种),那么您使用什么类型的 QWidget 来显示结果就无关紧要了;任何类型都可以。 (相反,如果您不安全地进行消息传递,Qt 的任何小部件都不会可靠地工作,因为它们都不希望它们的方法被多个线程直接调用)

关于c++ - Qt 线程计算输出到 GUI 中的自己的小部件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15992192/

相关文章:

c++ - 在 Windows 上快速编译 Qt C++

c++ - 基于集合派生对象中存在的类型选择行为的模式

c# - 我应该在退出主窗体之前中止并加入线程吗?

java - 从辅助线程在主线程上调用带参数的方法

javascript - 将 QtQuick/QML 对象传递给 javascript 函数后访问其属性

c++ - 如何启动具有 root 权限的 QProcess?

c++ - 如何调用函数指针数组中的函数?

c++ - 二项式随机数生成

java - 当线程崩溃时到底会发生什么?