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