等待函数使一个线程资源进入等待状态,直到制定的内核对象被触发为止。注意,如果线程在调用一个等待函数的时候,相应的内核对象已经出发触发状态,那么线程是不会进入等待状态的。
最常用的是WaitForSingleObject:
DWORD WaitForSingleObject(HANDLE hHandle,DWORD dwMilliseconds);
第一个参数hObject用来标识要等待的内核对象,这内核对象可以处于触发状态或未触发状态。
第二个参数用来指定线程最多愿意花多长的时间来等待对象被触发。当第二个参数设置为INFINITE,表示线程愿意永远等待。如果内核对象永远不被触发,那么调用线程永远不会被唤醒。
例子
DWORD dw=WaitForSingleObject(hProcess,5000);
switch(dw)
{
cse WAIT_OBJECT_0://规定的时间内等待成功。
break;
case WAIT_TIMEOUT://超时。
break;
case WAIT_FAILED://指定的句柄无效。
break;
Default:
break;
}
返回值表示为什么调用线程又能够继续执行了。如果线程等待的对象被触发,那么返回值是WAIT_OBJECT_0,如果是因为等待超时,那么返回值是WAIT_TIMEOUT,如果传入了一个无效参数,那么返回值是WAIT_FAILED。(这时候可以用GetLastError得到更多的信息)
WaitForMultipleObjects()允许你在同一时间等待一个以上的对象
DWORD WaitForMultipleObject(
DWORD nCount, //表示lphandles数组的元素个数
CONST HANDLE *lphandles, //指向一个有对象handles组成的数组。
BOOL bWaitAll, //如果为true,则表示所有的handles都必须激发,此函数才得以返回,否则,此函数将在任何一个handle激发时就返回。
DWORD dwMilliseconds //超时也返回,可为0,立即返回,INFINITE表示无穷等待。
);
有两种不同的方式来使用,一种是让线程进入等待状态直到指定内核对象的一个被触发为止,另一种是让线程进入等待状态直到制定内核对象中的全部被触发为止。
参数bWaitAll用来告诉我们希望使用哪种方式,如果给这参数传TRUE,那么在所有内核对象被触发之前,函数将不会允许调用线程继续执行。
下面有使用的伪代码
HANDLE h[3];
H[0]=hProcess1;
H[1=hProcess2;
H[2]=hProcess3;
DWORD dw=WaitForMultipleOBjecs(3,H,false,5000);
switch(dw)
{
case WAIT_OBJEC_0://第一个对象被触发。
break;
case WAIT_OBJEC_0+1://第二个对象被触发。
break;
case WAIT_OBJEC_0+2://第三个对象被触发。
break;
case WAIT_TIMEOUT://超时
break;
case WAIT_FAILED://句柄无效。
break;
}