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