簡體   English   中英

Qt線程計算輸出到GUI中自己的窗口小部件?

[英]Qt thread calculations output to own widgets in GUI?

因此,基本上,我要處理的該程序使用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的所有小部件都將無法可靠運行,因為它們都不希望它們的方法被多個線程直接調用)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM