参考资料:https://blog.csdn.net/tingsking18/article/details/5304254
qt的延时方法一般有以下3种:
1、精度低,卡界面,CPU占用少
Qt为我们提供了几个可以用于线程Sleep的函数,分别是:
void QThread::sleep ( unsigned long secs ) [static protected]
void QThread::msleep ( unsigned long msecs ) [static protected]
void QThread::usleep ( unsigned long usecs ) [static protected]
sleep的单位分别是秒、毫秒、微秒
如:QThread::msleep(100);
- sleep函数是使调用sleep函数的线程休眠,线程主动放弃时间片。当经过指定的时间间隔后,再启动线程,继续执行代码。
- 在一些多线程中可能会看到sleep(0),其主要目的是让出时间片。
- sleep函数的精度非常低,当系统越繁忙的时候它精度也就越低,有时候我们休眠1秒,可能3秒后才能继续执行。它的精度取决于线程自身优先级、其他线程的优先级,以及线程的数量等因素,所以说sleep函数是不能用来精确计时的。
2、使用时间轮询查看,不卡界面,但是 cpu 占用率高,起码50%以上
自定义的非阻塞延时函数:
void MySleep(unsigned int msec)
{
QTime delayTime = QTime::currentTime().addMSecs(msec);
while(QTime::currentTime() <delayTime )
{
QCoreApplication::processEvents(QEventLoop::AllEvents,100);
}
}
processEvents会让Qt继续处理线程所在的消息队列中未处理的消息,直到消息队列中没有消息可以处理,当进行长时间的操作的时候可以调用此函数(比方说拷贝文件)。
3、和2类似,当然还有很多类似的方法来做延时,但是通常这样做精度高了,然而CPU实在受不了
void mySleep(unsigned int msec)
{
QTimer t;
t.start();
while(t.elapsed() <msec)
{
QCoreApplication::processEvents();
}
}
总的来说,延时的使用还是看情况吧,如过你在 while里面需要延时,而且精度要求不是很高(个人觉得10ms界限吧),还是使用方法1吧,不然CPU被占的死死的!
最好是两种方式结合:
void MySleep(unsigned int msec)
{
QTime delayTime = QTime::currentTime().addMSecs(msec);
while(QTime::currentTime() < delayTime )
{
QCoreApplication::processEvents(QEventLoop::AllEvents,100);
QThread::msleep(100);
}
}
这样就达到来中和的效果了
关于此部分的一些知识点梳理:
(1)wait和sleep的比较
sleep()方法是使线程停止一段时间的方法。在sleep 时间间隔期满后,线程不一定立即恢复执行。这是因为在那个时刻,其它线程可能正在运行而且没有被调度为放弃执行,除非
(a)“醒来”的线程具有更高的优先级。
(b)正在运行的线程因为其它原因而阻塞。
wait()会使调用它的线程暂停执行,被调对象进入等待状态,直到被唤醒或等待时间到。