首先,关于sleep函数,网上搜到的结果是这样:

sleep函数是使调用sleep函数的线程休眠,线程主动放弃时间片。当经过指定的时间间隔后,再启动线程,继续执行代码。sleep函数并不能起到**定时**的作用,主要作用是**延时**。在一些多线程中可能会看到sleep(0);其主要目的是**让出时间片**。sleep函数的精度**非常低**,当系统越繁忙的时候它精度也就越低,有时候我们休眠1秒,可能3秒后才能继续执行。它的精度**取决于线程自身优先级**、**其他线程的优先级**,**以及线程的数量**等因素,所以说sleep函数是**不能**用来精确计时的。

Qt为我们提供了几个可以用于线程Sleep的函数(之前是protected类型的,现在改成了public),分别是:

void QThread::sleep ( unsigned long secs )   [static public]

void QThread::msleep ( unsigned long msecs )   [static public]

void QThread::usleep ( unsigned long usecs )   [static public]

sleep的单位分别是秒、毫秒、微秒。

自定义延时函数:使用QEventLoop、processEvents

void Widget::Sleep(int msec)

{

    QTime dieTime = QTime::currentTime().addMSecs(msec);

    while( QTime::currentTime() < dieTime )

        QCoreApplication::processEvents(QEventLoop::AllEvents, 100);

}

传入参数msec,使程序延时msec毫秒。这种方法不会阻塞当前线程,尤其适合Qt的单线程带UI程序,或者UI线程,因为线程阻塞时,很明显的现象就是UI卡死。当然,你也可以更改addMSecs为addSecs使程序延时msec秒。

如果去掉QCoreApplication::processEvents(QEventLoop::AllEvents, 100); 可以延时,但也会阻塞线程。

调用processEvents会让Qt继续处理线程所在的消息队列中未处理的消息,直到消息队列中没有消息可以处理。当进行长时间的操作的时候可以调用此函数(比方说拷贝文件)。这个函数可能和我们要使用msleep的本意有差别,但是使用它可以在svalue时间内处理events,从而达到类似sleep的目的。

但是,有网友指出这个屌函数会出问题,

https://blog.csdn.net/lidengfeng0ff/article/details/117987308

他建议更改为:

void Widget::Sleep(int msec)

{

    qint64 dieTime = QDateTime::currentDateTime().toMSecsSinceEpoch();

    while( QDateTime::currentDateTime().toMSecsSinceEpoch()-dieTime < msec )

    {

        QCoreApplication::processEvents(QEventLoop::AllEvents,100);

        QThread::msleep(1);

    }

}

或者干脆直接使用这种方法:

void AcqPressure::delaymsec(int msec)

{

    QEventLoop loop;

    QTimer::singleShot(msec,&loop,SLOT(quit()));

    loop.exec();

}


使用QWaitCondition

QWaitCondition wait;

wait.wait(time);

wait的单位是milliseconds,但是wait和sleep的作用是不同的。

sleep()方法是使线程停止一段时间的方法。在sleep 时间间隔期满后,线程不一定立即恢复执行。这是因为在那个时刻,其它线程可能正在运行而且没有被调度为放弃执行,除非

  • “醒来”的线程具有更高的优先级。

  • 正在运行的线程因为其它原因而阻塞。

wait()会使调用它的线程暂停执行,被调对象进入等待状态,直到被唤醒或等待时间到。