一、QThread::sleep()、QThread::msleep()、QThread::usleep()
QThread::sleep(1); //延迟1s
QThread::msleep(1); //延迟1ms
QThread::usleep(1); //延迟1us
说明:sleep不会释放对象锁,其他线程无法访问对象,因此会阻塞线程;
二、QElapsedTimer
定义一个QElapsedTimer的对象,调用它的start() 方法开始计时,完成一个耗时操作后,再调用它的elapsed() 方法,得到耗时操作所花费的具体时间,以毫秒计算。
#include <QElapsedTimer>
QElapsedTimer t;
t.start();
while(t.elapsed() < 10); //延迟10s
说明:会阻塞线程
三、QEventLoop
int msec = 1; //1毫秒
QTime dieTime = QTime::currentTime().addMSecs(msec);
while( QTime::currentTime() < dieTime )
{
QCoreApplication::processEvents(QEventLoop::AllEvents);
}
说明:
这种方法不会阻塞当前线程,适合Qt的UI线程中使用。
更改addMSecs为addSecs使程序延时为秒级。
QCoreApplication::processEvents(QEventLoop::AllEvents, 100)的作用:使程序在while等待期间,去处理一下本线程的事件循环,处理事件循环最多100ms必须返回本语句,如果提前处理完毕,则立即返回这条语句。
四、QTimer::singleShot
int msec = 10; //延迟10ms
//定义一个新的事件循环
QEventLoop loop;
//创建单次定时器,槽函数为事件循环的退出函数
QTimer::singleShot(int(msec), &loop, SLOT(quit()));
//事件循环开始执行,程序会卡在这里,直到定时时间到,本循环被退出
loop.exec();
说明:
singleShot:在给定的时间间隔后,此静态函数将调用一指定的槽函数。(不会阻塞线程)使用此功能非常方便,因为无需费心timerTimer或创建本地QTimer对象。QTimer::singleShot(3*1000,this, &Widget::function);
loop.exec():子层事件循环具有父层事件循环的所有功能,所以当在主线程中启动各种exec()(比如QEventLoop::exec())时,虽然会打断main函数中的QApplication::exec(),但是Gui界面还是可以正常响应,不会出现卡住的现象。这与用while来循环是不一样的。