Qt程序CPU占用率較高的解決辦法
分析思路
總的來說,Qt程序CPU占用率較高的原因可能有以下幾點:
1、在paintEvent中調用update函數,造成無限循環
2、頻繁刷新數據
3、復雜的浮點運算
4、死循環
5、paintEvent里操作太多
我遇到這個問題的程序是利用多個子線程(接收子線程)同時接收並解析網口的數據,同時另外一個子線程(融合子線程)對多個子線程解析得到的數據進行融合處理,接收子線程和融合子線程之間通過Qt的信號-槽機制進行數據交互。
通過分析發現,各子線程運行之后均處於死循環狀態,即使此時沒有待接收/處理的數據,線程也會處於“空轉”狀態,由此導致了CPU的過分占用。
解決辦法
對於上述情況導致的CPU占用率過高問題,可以根據子線程數量以及子線程循環中需要實時處理的數據量的多少來給子線程添加合適的休眠時間。
具體來說,可以使用QThread類中的sleep(或msleep、usleep)成員函數將線程暫時掛起一段時間,指定時間一過,線程將自動喚醒。
當運行中的子線程數量較少時,一般只要在子線程死循環的末尾使用sleep(0);即可,這樣理論上雖然不會是線程掛起任何時間,但是該調用會使線程自動放棄當前的時間片,使時間片可以被系統分配給另外的線程,這樣就可以有效減少線程占用的CPU資源。
但是若程序中同時運行的子線程較多,使用sleep(0);可能仍然無法降低程序CPU的占用率,這時可以根據子線程循環中需要實時處理的數據量來指定合適的線程掛起時間。
由於我的程序中用到的子線程數量較多,經過測試,使用sleep(0);無法取得明顯的效果,最終指定每個子線程在循環的末尾掛起15ms,即:
1 while(true) 2 { 3 ... 4 msleep(15); 5 }
