|
《Windows游戏编程大师技巧》(第二版)第11章(31) Get ready for the most confusing explanation you've ever heard… but it's not my fault, really! Whenever any thread terminates, it becomes signaled to the kernel, and when it is running, it is unsignaled. Whatever that means. And what is the price of plastic zippers tomorrow? You don't care! But what you do care about is how to test for the signaling. 我们知道,任何线程结束时都会向内核发出信号(Signaled),而它们运行时不会发出信号(Unsignaled)。需要了解的是如何监测这些信号。 可以使用Wait*()函数族来实现事件监测,该类函数可以实现单信号或多信号的侦测。此外,你可以调用其中一个Wait*()函数来等待,直到信号产生。这样做就可以避免使用忙循环。在绝大多数情况下,这样做要远优于轮询全局变量的方法。图11-21示意了Wait*()函数的工作机制以及与运行程序和OS内核间的关系。 图11-21:使用Wait*()函数的信号时间关系 需要使用的两个函数分别是WaitForSingleObject()和WaitForMultipleObjects()。这两个函数分别用于单信号和多信号侦测。它们的定义如下: DWORD WaitForSingleObject(HANDLE hHandle, // handle of object to wait for DWORD dwMilliseconds ); // time-out interval in milliseconds hHandle用于确定对象。 dwMilliseconds定义超时时间,以毫秒为单位。如果该段时间间隔已经过去,即使侦测对象无信号也要返回。如果dwMilliseconds值为0,函数就立刻测读对象的状态并返回。如果其值为无限大,则函数永不超时。 If the function succeeds, the return value indicates the event that caused the function to return. If the function fails, the return value is WAIT_FAILED. To get extended error information, call GetLastError(). 如果该函数执行成功,其返回值包含返回的条件状态。如果该函数执行失败,返回值是WAIT_FAILED。调用函数GetLastError()可以获得详细的出错信息。 该函数的成功返回值有以下几种: • WAIT_ABANDONED——所指定的对象是一个互斥对象,该对象在所属线程结束前不能被线程释放。互斥对象的所有权被授予调用线程,互斥对象被设置为无信号。 • WAIT_OBJECT_0——指定对象的状态是有信号的。 • WAIT_TIMEOUT——超时时间已过,对象的状态是无信号的。 一般说来,WaitForSingleObject()函数检查指定对象的当前状态。如果对象无信号,调用线程就进入一种很有效率的等待状态。在此期间,该线程只占用极少的CPU时间,直到它等待的条件之一得到满足才结束等待。下面是多信号侦测函数,主要用于终止多个线程: DWORD WaitForMultipleObjects(DWORD nCount, // number of handles // in handle array
|