Qt非阻塞和阻塞延时

scorlw 发布于

Qt非阻塞和阻塞延时

Qt

一、关于Qt实现非阻塞延时的方法:

1.

1
2
3
4
5
6
7
void QSleepTimeSet::Delay_MSec(unsigned int msec)
{
QTime _Timer = QTime::currentTime().addMSecs(msec);

while( QTime::currentTime() < _Timer )
QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
}

其中的msec为需要延时的毫秒数,例如,你要实现5秒延时,则msec的值就是 :5000

2.

创建子事件循环,在子事件循环中,父事件循环仍然是可以执行的。这种方法不会阻塞线程

1
2
3
4
5
6
void Delay_MSec(unsigned int msec)
{
QEventLoop loop;//定义一个新的事件循环
QTimer::singleShot(msec, &loop, SLOT(quit()));//创建单次定时器,槽函数为事件循环的退出函数
loop.exec();//事件循环开始执行,程序会卡在这里,直到定时时间到,本循环被退出
}

耗时代码的处理,参考:
https://blog.csdn.net/qq_31073871/article/details/80472347

二、关于Qt中的阻塞延时实现方法:

1.

1
2
3
4
5
6
7
8
9
void QSleepTimeSet::Delay_MSec_Suspend(unsigned int msec)
{
QTime _Timer = QTime::currentTime();

QTime _NowTimer;
do{
_NowTimer=QTime::currentTime();
}while (_Timer.msecsTo(_NowTimer)<=msec);
}

其中的msec为需要延时的毫秒数,例如,你要实现5秒延时,则msec的值就是 :5000

2.

使用QElapsedTimer,头文件:#include <QElapsedTimer>

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

上述代码使程序延时10S(10000MS),但是这种方法也会阻塞线程。

三、多线程程序的延时

多线程程序使用QThread::sleep()或者QThread::msleep()QThread::usleep()QThread::wait()进行延时处理。Sleep不会释放对象锁,其他线程无法访问对象,因此会阻塞线程;而Wait会释放对象锁,使得其他线程能够访问该对象。

原文地址:https://my.oschina.net/u/4369303/blog/3730605

https://blog.csdn.net/qq_40194498/article/details/80063960