关于QT延时

一、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来循环是不一样的。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值