qt延時之延時方法及cpu佔用問題

參考資料: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()會使調用它的線程暫停執行,被調對象進入等待狀態,直到被喚醒或等待時間到。

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章