【Sleep、SleepEx】Sleep和 SleepEx函数

来源:互联网 发布:专升本远程网络教育 编辑:程序博客网 时间:2024/06/08 14:15
【转自:http://blog.sina.com.cn/s/blog_4c0cb1c001019amf.html】
Sleep和 SleepEx函数的功能是在指定的执行时间内中止所在线程的执行。
SleepEx扩展了Sleep的功能,在最短超时时间间隔已到的情况下恢复线程执行外,在以下两种情况下发生时也可以恢复执行:I/O完成回调函数被调用、异步过程调用(APC)被安排进入线程中。


Sleep函数原型:
VOID WINAPI Sleep(
    DWORD dwMillseconds);

dwMilliseconds: 指定线程挂起最短时间间隔,以ms为单位。如设为常数INFINITE,表示将一个线程永久性的催眠
返回值:无。

SleepEx函数原型:
DWORD WINAPI SleepEx(
    DWORD dwMillesconds,
    BOOL bAlertable);
参数:
dwMilliseconds: 指定线程挂起最短时间间隔,以ms为单位,时间一到不管后面参数如何都会返回,如设为常数INFINITE,表示将一个线程永久性的催眠
bAlertable: 设置为FALSE,那么,在线程挂起期间不会响应。即使一个I/O完成回调函数被调用或有新的APC排进入,他们使函数返回,也不会被执行。//若是 True, 只要有 APC 函数申请, SleepEx 不管第一个参数如何都会把 APC 推入队列并随 APC 函数一起返回.//注意: SetWaitableTimer 和 SleepEx 必须在同一个线程才可以.
如用一个ReadFileEx   或   WriteFileEx函数调用初始化了一个异步I/O传输,而且我们希望函数返回,以便由那些函数指定的I/O结束例程能正常执行,就设为TRUE。

返回值:
 Long。返回0表示时间间隔完成,返回WAIT_IO_COMPLETION表示I/O完成回调函数被调用。

APC是内核的一种软中断性质的东西,后面那个参数应该是这个意思,如果是false,就算有APC被插入,也要等到等待的时间到了,SleepEX才退出,如果是false,那只要有新的APC被插入了,SleepEx就马上返回了。 其实Windows的内核中Sleep就简单地理解就是线程挂在那里多少时间,不对这个线程调度。CPU的时间片都分配到其他线程中,除非等待时间到了,再继续调度和分配时间片。APC就相当于一个额外的调度。