0

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

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

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

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

4

1 回答 1

1

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

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

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

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

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

于 2013-04-14T03:34:29.637 回答