你有兩種選擇。更有效的方法是將計算放入另一個線程(或多線程,現代PC中的單核CPU很少)。 JSilver's answer有幾個鏈接給你。
但是,線程有許多線程相關的東西,你必須學習和考慮。如果你不知道自己在做什麼,那麼有很多潛在的細微缺陷。所以我會推薦其他方法作爲第一步,單線程。作爲獎勵,它將在稍後更容易地轉向多線程解決方案。
創建一個普通的QObject子類。在這個QObject中,將你的計算狀態作爲成員變量。
將插槽方法寫入上面的類中,該方法執行一小段計算,然後返回。它應該在50毫秒左右的時間內完成,以獲得良好的用戶體驗。你可以在你的循環中使用固定數量的迭代,或者使用QElapsedTimer
來衡量時間,或者其他任何東西。然後,再次調用時,該方法應該再次繼續計算另一個50ms。當計算完成時,該方法可以例如發出信號,結果爲。
添加一個QTimer
,間隔爲0.將超時連接到上述插槽方法。這裏的區間0實際上意味着,Qt會盡可能多地調用該方法。你想要這個,因爲你當然希望計算儘快完成。但是,由於該方法很快會返回,因此Qt可以在再次調用您的方法之前執行其他操作(更新GUI等)。
一旦這個工作,在單線程,你可以學習做Qt線程和移動工作對象住在另一個線程,爲潛在地提高性能。此外,如果遇到線程問題,您將有單線程基線版本進行比較。
如果我們能夠檢查你的代碼,那將會很棒。可能是你分配了兆字節的內存,或者這個值太大了。 – Mikhail
對不起,這是不可能的,因爲代碼很長。是否有可能通常停止此消息+行爲? – user3443063
查看https://doc.qt.io/archives/qq/qq27-responsive-guis.html – Corristo