在Qt中使用sleep
关于
sleep
函数,我们先来看一下他的作用:
sleep
函数是使调用
sleep
函数的线程休眠,线程主动放弃时间片。当经过指定的时间间隔后,再启动线程,继续执行代码。
sleep
函数并不能起到定时的作用,主要作用是延时。在一些多线程中可能会看到
sleep(0);
其主要目的是让出时间片。
sleep
函数的精度非常低,当系统越繁忙的时候它精度也就越低,有时候我们休眠
1
秒,可能
3
秒后才能继续执行。它的精度取决于线程自身优先级、其他线程的优先级,以及线程的数量等因素,所以说
sleep
函数是不能用来精确计时的。
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
的单位分别是秒、毫秒、微秒。
但是现在问题出来了,请仔细看上面的函数定义,函数的访问权限都是
protected
,这就意味着,我们必须在
QThread
或者他的继承类中使用这三个函数。
但是我们可能需要在非继承
QThread
的类中来使用
sleep
函数。那这该这么办呢?下面我就给大家提供几种解决方法。
1.
processEvents
QTime dieTime = QTime::currentTime().addMSecs(svalue);
while( QTime::currentTime() < dieTime )
QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
调用
processEvents
会让
Qt
继续处理线程所在的消息队列中未处理的消息,直到消息队列中没有消息可以处理。当进行长时间的操作的时候可以调用此函数
(
比方说拷贝文件
)
。这个函数可能和我们要使用
msleep
的本意有差别,但是使用它可以在
svalue
时间内处理
events
,从而达到类似
sleep
的目的。
2.
QWaitCondition
QWaitCondition wait;
wait.wait(time);
wait
的单位是
milliseconds
,但是
wait
和
sleep
的作用是不同的。
sleep()
方法是使线程停止一段时间的方法。在
sleep
时间间隔期满后,线程不一定立即恢复执行。这是因为在那个时刻,其它线程可能正在运行而且没有被调度为放弃执行,除非
(a)
“醒来”的线程具有更高的优先级。
(b)
正在运行的线程因为其它原因而阻塞。
wait()
会使调用它的线程暂停执行,被调对象进入等待状态,直到被唤醒或等待时间到。
3.
查看
sleep
的源代码,使用
Qt
在
win
下和
*nix
下的
sleep
函数。
Windows
下的
sleep
的代码为:
void QThread::sleep(unsigned long secs)
{
::Sleep(secs * 1000);
}
sleep
的单位为秒。
*nix
下
sleep
的代码为:
void QThread::sleep(unsigned long secs)
{
struct timeval tv;
gettimeofday(&tv, 0);
struct timespec ti;
ti.tv_sec = tv.tv_sec + secs;
ti.tv_nsec = (tv.tv_usec * 1000);
thread_sleep(&ti);
}
static void thread_sleep(struct timespec *ti)
{
pthread_mutex_t mtx;
pthread_cond_t cnd;
pthread_mutex_init(&mtx, 0);
pthread_cond_init(&cnd, 0);
pthread_mutex_lock(&mtx);
(void) pthread_cond_timedwait(&cnd, &mtx, ti);
pthread_mutex_unlock(&mtx);
pthread_cond_destroy(&cnd);
pthread_mutex_destroy(&mtx);
}
我们可以对这两个函数进行简单的封装,从而达到真正的
sleep
的作用。
转载声明:
本文转自
http://blog.csdn.net/tingsking18/archive/2010/02/10/5304254.aspx
原文: 在Qt中使用sleep
版权所有: 本文系米扑博客原创、转载、摘录,或修订后发表,最后更新于 2011-05-18 21:58:18
侵权处理: 本个人博客,不盈利,若侵犯了您的作品权,请联系博主删除,莫恶意,索钱财,感谢!
转载注明: 在Qt中使用sleep (米扑博客)