2017-04-25 48 views
0

我有一個關於長計算一個問題:Qt的C++「keineRückmeldung」 - 在GUI錯誤時長計算

在執行我的GUI的一些任務長計算可能完成。這不是問題,只需要一段時間 - 一切正常(至少結果很好)。

讓我困擾的是,在一定的時間後,我的GUI似乎並沒有作出迴應:比如我ProcessBar是計算過程中顯示將不顯示在我的GUI文本「keineRückmeldung」的標題欄被添加(這意味着像忙,墜毀等 - 抱歉,我不知道正確的翻譯,這使我很難找到任何有關該問題的互聯網)。

是否有可能停止該行爲?

謝謝。

+0

如果我們能夠檢查你的代碼,那將會很棒。可能是你分配了兆字節的內存,或者這個值太大了。 – Mikhail

+0

對不起,這是不可能的,因爲代碼很長。是否有可能通常停止此消息+行爲? – user3443063

+2

查看https://doc.qt.io/archives/qq/qq27-responsive-guis.html – Corristo

回答

1

你有兩種選擇。更有效的方法是將計算放入另一個線程(或多線程,現代PC中的單核CPU很少)。 JSilver's answer有幾個鏈接給你。

但是,線程有許多線程相關的東西,你必須學習和考慮。如果你不知道自己在做什麼,那麼有很多潛在的細微缺陷。所以我會推薦其他方法作爲第一步,單線程。作爲獎勵,它將在稍後更容易地轉向多線程解決方案。

  1. 創建一個普通的QObject子類。在這個QObject中,將你的計算狀態作爲成員變量。

  2. 將插槽方法寫入上面的類中,該方法執行一小段計算,然後返回。它應該在50毫秒左右的時間內完成,以獲得良好的用戶體驗。你可以在你的循環中使用固定數量的迭代,或者使用QElapsedTimer來衡量時間,或者其他任何東西。然後,再次調用時,該方法應該再次繼續計算另一個50ms。當計算完成時,該方法可以例如發出信號,結果爲

  3. 添加一個QTimer,間隔爲0.將超時連接到上述插槽方法。這裏的區間0實際上意味着,Qt會盡可能多地調用該方法。你想要這個,因爲你當然希望計算儘快完成。但是,由於該方法很快會返回,因此Qt可以在再次調用您的方法之前執行其他操作(更新GUI等)。

一旦這個工作,在單線程,你可以學習做Qt線程和移動工作對象住在另一個線程,爲潛在地提高性能。此外,如果遇到線程問題,您將有單線程基線版本進行比較。

2

您應該將GUI-Thread中昂貴且持久的計算外包給工作線程,以防止GUI凍結。

Qt的文檔:Threading Basics

的QThread使用率的很好的解釋,我發現有用:How To Really, Truly Use QThreads

GUI本身無法從工作線程改變。您必須notify您的主線程關於數據更改並從那裏更新您的GUI。