qt延时之延时方法及cpu占用问题

参考资料: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()会使调用它的线程暂停执行,被调对象进入等待状态,直到被唤醒或等待时间到。

 

猜你喜欢

转载自blog.csdn.net/qq_35820102/article/details/85529627