2017-03-31 58 views
-1

我有繁重的任務。我創建了QProgressBar來顯示該程序仍然工作,並在另一個使用C++ std :: thread類的線程中運行繁重的任務。但QProgressBar不起作用,只有QProgressBar的窗口啓動。 下面是代碼:QProgressBar和重任務

QProgressBar progress; 
progress.setRange(0, 0); 
progress.show(); 
if (keyLength == 1024) 
    std::thread(&RSA::generateKeys, &rsa, RSA::RSA_1024).join(); 
else if (keyLength == 2048) 
    std::thread(&RSA::generateKeys, &rsa, RSA::RSA_2048).join(); 

下面是結果: enter image description here

+2

而且,哪裏是代碼,它表示更改狀態的進度欄?爲什麼將進度條設置爲未確定狀態,而不是設置有效的最小/最大值,並且每當當前值發生變化時就發出信號? –

+0

它應該運行並沒有最小值和最大值運行,就像這樣http://doc.qt.io/qt-5/images/macintosh-progressbar.png – van9petryk

+1

請詳細說明_how_你認爲它是這樣嗎?在正確的時間內,它應該如何運行0-100%的進度條長度,沒有任何更新狀態的信號? –

回答

0

這不是事情是如何完成的。 :) Here您可以看到我使用Worker模式(一個單獨的線程處理一些繁重的任務並向UI報告)所做的示例。這裏是我的應用程序的外觀:

enter image description here

我用QThread(包含處理的處理對象工作線程),我只能建議你這樣做。您也可以子類QThread並根據您真正需要替代run()方法,但情況很少。

PS:作爲一種替代方案,您可以使用QRunnable(對於每隔一段時間完成一次的任務非常有用,不需要單獨管理所有時間)。 QRunnable的問題在於它不包含QObject,這意味着您無法使用插槽信號機制向UI報告。當然,你可以改變它,但是它打破了runnable的目的,它的目標是成爲一個非常輕量級的解決方案。

+0

我不明白,爲什麼我不能使用C++線程執行此任務?我不想報告,我做了多少任務,我只想報告用戶,那個任務仍在解決。 – van9petryk

+0

從我的理解你想要進度條來報告任務(在單獨的線程)已經完成了多遠,對嗎?向用戶界面回報需要你使用信號,因爲'QThread'是最好的選擇。 – rbaleksandar

+0

@rbaleksandar'QThread'是一個線程句柄。就像你不會修改文件句柄類一樣,你不應該通過派生它來修改'QThread'。如果你想要信號,從'QObject'派生,或者放棄信號並將調用直接排隊到接收者,[GCD-style](http://stackoverflow.com/a/21653558/1329652)。您可以從任何線程發出信號或排隊插槽呼叫。在這方面,「QThread」並不特別。 –