8、Qt延时

一、QThread::sleep()、QThread::msleep()、QThread::usleep()

QThread::sleep(1);                  //延迟1s

QThread::msleep(1);               //延迟1ms

QThread::usleep(1);                 //延迟1us

说明:sleep不会释放对象锁,其他线程无法访问对象,因此会阻塞线程

二、QElapsedTimer

#include

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线程中使用;线程阻塞时,很明显的现象就是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来循环是不一样的。

你可能感兴趣的:(Qt小功能,qt,开发语言)