2012-07-28 29 views
1

我有一個QThread,它執行大量計算(它可以運行幾分鐘),並且在一個(並且只有一個)點需要用戶輸入,例如以yes /沒有對話框。當然,沒有GUI元素可以訪問,也沒有從線程打開的對話框(Qt設計選項),因爲它不是主線程。Qt線程等待來自GUI的輸入

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

我的想法:

  1. 因爲只有一個點的輸入必須從GUI讀取,我可以有兩個線程,被評爲對話框後,正在啓動第二個線程。問題:它使代碼變得不靈活,如果以後我必須引入更多對話框會怎麼樣?不太可能,但可能會發生。
  2. 我只有一個線程,並在兩個方向上與信號和插槽進行通信(我只有「線程到主」形式的信號的經驗,而不是相反的方向)。所以線程運行,到了必須做出用戶決定的地步,所以線程向main(又名GUI線程)發出一個信號,主要在一個槽中捕獲它,創建對話框,評估結果,以及向線程發出信號。現在怎麼辦?線程捕獲一個插槽中的信號,但它應該如何影響正在進行計算的run()方法?如果run()退出,則線程將死亡。所以我在我的run()功能while (!can_continue) { sleep(); }和我設置的can_continue在我抓到從主發送的信號的插槽中有這樣的事情。不過,我對這是最簡單/最優雅的解決方案有一些懷疑。 我應該知道的一般習慣嗎?

回答

3

由於you are working with Qt thread wrong產生了第二個版本的問題。

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

void stage1Finished(); 
void stage2Fibished(); 

和插槽:

void startStage1(); 
void startStage2(); 

然後創建Qthread線程對象,推Worker於螺紋,螺紋的started()信號連接startStage1() ,在信號stage1Finished()上顯示對話框並連接對話接受信號startStage2()。連接stage2Finished與線程的exit()插槽。

那麼你不必在任何地方睡覺,所有的信號處理都將通過Qthread中的標準機制。然後,您只需啓動線程即可開始處理並在處理完成時獲取finished信號。

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

+0

您能否詳細說明一下?從QThread中派生出來的'Worker'是什麼?我是否理解正確,並且是否使用了*原來的工作者線程而不是除此之外?在run()方法中應該存在什麼,在run()完成後不要關閉線程。我假設我不應該重寫'run()',所以線程不會退出,除非專門調用'exit()'。不僅對我來說,我確信自己正確地理解了這一點,但它對於更多讀者也是有用的。 – vsz 2012-07-28 14:42:31

+0

@vsz,請閱讀給定的鏈接。它詳細解釋了想法。簡而言之,你有「原始的」'QThread'對象,並且你有'Worker'對象,將worker對象移動到給定的線程,並且在那之後所有的工作者插槽通過在給定線程的上下文中執行的信號/插槽連接來執行。 – Lol4t0 2012-07-28 14:48:16