2013-04-13 51 views
0

所以基本上我正在操作的这个程序在Qt中使用线程来使用指定数量的线程(最多4个线程)来查找指定范围内的所有素数。Qt线程计算输出到GUI中的小部件?

每个线程都必须输出其在某种GUI窗口小部件中找到的素数。

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

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

回答

1

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

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

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

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

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