簡體   English   中英

Qt線程等待來自GUI的輸入

[英]Qt thread waiting input from the GUI

我有一個QThread,可以進行大量的計算(它可以運行幾分鍾),並且在一個(且只有一個)點需要用戶輸入,例如以是/否對話的形式。 當然,沒有GUI元素可以訪問,並且沒有從線程打開對話框(Qt設計選擇),因為它不是主線程。

那么有很多明顯的解決方案,但我對“推薦”解決方案或“最佳實踐”感興趣。

我的想法:

  1. 因為只有一點必須從GUI讀取輸入,我可以有兩個線程,第二個線程在評估對話框后啟動。 問題:它使代碼不靈活,如果我以后要引入更多對話框怎么辦? 不太可能,但可能會發生。
  2. 我只有一個線程,我在兩個方向上與信號和插槽通信(我只有“線到主”信號的經驗,而不是相反的方向)。 所以線程運行,到了必須做出用戶決定的程度,所以線程向主(也就是GUI線程)發出信號,主要在一個槽中捕獲它,創建對話框,評估結果,以及向線程發出信號。 現在怎么辦? 線程捕獲插槽中的信號,但它應該如何影響正在進行計算的run()方法? 如果run()退出,則線程死亡。 所以我在run()函數中有這樣的東西: while (!can_continue) { sleep(); } while (!can_continue) { sleep(); }和予設定can_continue在我趕上了信號發送的形式的主要的插槽。 但是,我對這是最簡單/最優雅的解決方案存在疑問。 我應該知道一般的做法嗎?

你的第二個版本的問題出現是因為你正在使用Qt線程錯誤

您應該創建具有信號的新對象class Worker: public QObject

void stage1Finished();
void stage2Fibished();

和插槽:

void startStage1();
void startStage2();

然后創建Qthread線程對象,將Worker推送到線程,將startStage1()連接到線程的started()信號,在信號stage1Finished()上顯示對話框,並使用startStage2()連接dialog-accepted-signal 連接stage2Finished與線程的exit()槽。

然后你不必在任何地方睡覺,所有信號處理都將通過Qthread標准機制。 然后,您只需啟動線程即可開始處理,並在處理完成后獲得finished信號。

在將信號連接到插槽時,請使用Qt::QueuedConnection

暫無
暫無

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

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