Qt 延時處理的幾種辦法


有些時候,我們需要程序延時一會兒:

這里提供四種方法:

1、多線程程序使用QThread::sleep()或者QThread::msleep()或QThread::usleep()或QThread::wait()進行延時處理。

Sleep不會釋放對象鎖,其他線程無法訪問對象,因此會阻塞線程;而Wait會釋放對象鎖,使得其他線程能夠訪問該對象。

 

2、自定義延時函數:
使用QEventLoop

1 void Widget::Sleep(int msec) 2 { 3     QTime dieTime = QTime::currentTime().addMSecs(msec); 4     while( QTime::currentTime() < dieTime ) 5         QCoreApplication::processEvents(QEventLoop::AllEvents, 100); 6 }

傳入參數msec,使程序延時msec毫秒。這種方法不會阻塞當前線程,尤其適合Qt的單線程帶UI程序,或者UI線程,因為線程阻塞時,

很明顯的現象就是UI卡死。當然,你也可以更改addMSecs為addSecs使程序延時msec秒。

如果去掉QCoreApplication::processEvents(QEventLoop::AllEvents, 100); 可以延時,但也會阻塞線程

QCoreApplication::processEvents(QEventLoop::AllEvents, 100);

使程序在while等待期間,去處理一下本線程的事件循環,處理事件循環最多100ms必須返回本語句,如果提前處理完畢,則立即返回這條語句。


3、使用QElapsedTimer
頭文件:#include <QElapsedTimer>

1 QElapsedTimer t; 2 t.start(); 3 while(t.elapsed()<10000);

上述代碼使程序延時10S(10000MS),但是這種方法也會阻塞線程。

 

4、 創建子事件循環,在子事件循環中,父事件循環仍然是可以執行的
這種方法不會阻塞線程

1 void Delay_MSec(unsigned int msec) 2 { 3     QEventLoop loop;//定義一個新的事件循環
4     QTimer::singleShot(msec, &loop, SLOT(quit()));//創建單次定時器,槽函數為事件循環的退出函數
5     loop.exec();//事件循環開始執行,程序會卡在這里,直到定時時間到,本循環被退出
6 }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM