1. 程式人生 > >qt延時之延時方法及cpu佔用問題

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()會使呼叫它的執行緒暫停執行,被調物件進入等待狀態,直到被喚醒或等待時間到。