qt延時之延時方法及cpu佔用問題
阿新 • • 發佈:2019-01-02
參考資料:https://blog.csdn.net/tingsking18/article/details/5304254
qt的延時方法一般有以下3種:
1、精度低,卡介面,CPU佔用少
Qt為我們提供了幾個可以用於執行緒Sleep的函式,分別是: void QThread::sleep ( unsigned long secs ) [static protected] void QThread::msleep ( unsigned long msecs ) [static protected] void QThread::usleep ( unsigned long usecs ) [static protected] sleep的單位分別是秒、毫秒、微秒 如:QThread::msleep(100);
- sleep函式是使呼叫sleep函式的執行緒休眠,執行緒主動放棄時間片。當經過指定的時間間隔後,再啟動執行緒,繼續執行程式碼。
- 在一些多執行緒中可能會看到sleep(0),其主要目的是讓出時間片。
- sleep函式的精度非常低,當系統越繁忙的時候它精度也就越低,有時候我們休眠1秒,可能3秒後才能繼續執行。它的精度取決於執行緒自身優先順序、其他執行緒的優先順序,以及執行緒的數量等因素,所以說sleep函式是不能用來精確計時的。
2、使用時間輪詢檢視,不卡介面,但是 cpu 佔用率高,起碼50%以上
自定義的非阻塞延時函式:
void MySleep(unsigned int msec) { QTime delayTime = QTime::currentTime().addMSecs(msec); while(QTime::currentTime() <delayTime ) { QCoreApplication::processEvents(QEventLoop::AllEvents,100); } }
processEvents會讓Qt繼續處理執行緒所在的訊息佇列中未處理的訊息,直到訊息佇列中沒有訊息可以處理,當進行長時間的操作的時候可以呼叫此函式(比方說拷貝檔案)。
3、和2類似,當然還有很多類似的方法來做延時,但是通常這樣做精度高了,然而CPU實在受不了
void mySleep(unsigned int msec) { QTimer t; t.start(); while(t.elapsed() <msec) { QCoreApplication::processEvents(); } }
總的來說,延時的使用還是看情況吧,如過你在 while裡面需要延時,而且精度要求不是很高(個人覺得10ms界限吧),還是使用方法1吧,不然CPU被佔的死死的!
最好是兩種方式結合:
void MySleep(unsigned int msec)
{
QTime delayTime = QTime::currentTime().addMSecs(msec);
while(QTime::currentTime() < delayTime )
{
QCoreApplication::processEvents(QEventLoop::AllEvents,100);
QThread::msleep(100);
}
}
這樣就達到來中和的效果了
關於此部分的一些知識點梳理:
(1)wait和sleep的比較
sleep()方法是使執行緒停止一段時間的方法。在sleep 時間間隔期滿後,執行緒不一定立即恢復執行。這是因為在那個時刻,其它執行緒可能正在執行而且沒有被排程為放棄執行,除非
(a)“醒來”的執行緒具有更高的優先順序。
(b)正在執行的執行緒因為其它原因而阻塞。
wait()會使呼叫它的執行緒暫停執行,被調物件進入等待狀態,直到被喚醒或等待時間到。