首先,关于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的目的。
但是,有网友指出这个屌函数会出问题,
他建议更改为:
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()会使调用它的线程暂停执行,被调对象进入等待状态,直到被唤醒或等待时间到。
评论