有些時候,我們需要程序延時一會兒:
這里提供四種方法:
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 }