2013-04-13 91 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的任何部件都不能可靠地工作,因爲他們都不希望自己的方法直接被多線程調用)