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

时间:2013-04-13 19:50:59

标签: c++ multithreading qt widget

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

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

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

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

1 个答案:

答案 0 :(得分:1)

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

相反,您的计算线程需要向主线程发送消息,要求它代表他们更新小部件。

通常最简单的方法是让计算线程发出一个包含你想要显示的数据的信号(例如作为QString),并通过QueuedConnection将信号发送到相应的小部件的connect() setText()槽(或更新窗口小部件的其他适当槽)。

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

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