关于



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