等待函數(shù)可使線程自愿進(jìn)入等待狀態(tài),直到一個特定的內(nèi)核對象變?yōu)橐淹ㄖ獱顟B(tài)為止。
WaitForSingleObject 函數(shù)
DWORD WaitForSingleObject(
HANDLE hObject,
DWORD dwMilliseconds
);
第一個參數(shù)hObject標(biāo)識一個能夠支持被通知/未通知的內(nèi)核對象(前面列出的任何一種對象都適用)。
第二個參數(shù)dwMilliseconds允許該線程指明,為了等待該對象變?yōu)橐淹ㄖ獱顟B(tài),它將等待多長時間。(INFINITE為無限時間量,INFINITE已經(jīng)定義為0xFFFFFFFF(或-1))
傳遞INFINITE有些危險。如果對象永遠(yuǎn)不變?yōu)橐淹ㄖ獱顟B(tài),那么調(diào)用線程永遠(yuǎn)不會被喚醒,它將永遠(yuǎn)處于死鎖狀態(tài),不過,它不會浪費(fèi)寶貴的C P U時間。
例子:
DWORD dw = WaitForSingleObject(hProcess,5000);
switch(dw)
{
case WAIT_OBJECT_0:
// The process terminated.
break;
case WAIT_TIMEOUT:
// The process did not terminate within5000 milliseconds.
break;
case WAIT_FAILED:
// Bad call to function (invalid handle?)
break;
}
上面這個代碼告訴系統(tǒng),在特定的進(jìn)程(hProcess)終止運(yùn)行(進(jìn)程hProcess終止運(yùn)行變成已經(jīng)通知)之前,或者在5000m s時間結(jié)束之前,調(diào)用線程不應(yīng)該變?yōu)榭烧{(diào)度狀態(tài)。
WaitForSingleObject的返回值能夠指明調(diào)用線程為什么再次變?yōu)榭烧{(diào)度狀態(tài)。
如果線程等待的對象變?yōu)橐淹ㄖ獱顟B(tài),那么返回值是WAIT_OBJECT_0。
如果設(shè)置的超時已經(jīng)到期,則返回值是WAIT_TIMEOUT。
如果將一個錯誤的值(如一個無效句柄)傳遞給WaitForSingleObject,那么返回值將是WAIT_FAILED(若要了解詳細(xì)信息,可調(diào)用GetLastError)。
WaitForMultipleObjects函數(shù)
WaitForMultipleObjects函數(shù)與WaitForSingleObject函數(shù)很相似,區(qū)別在于它允許調(diào)用線程同時查看若干個內(nèi)核對象的已通知狀態(tài):
DWORD WaitForMultipleObjects(
DWORD dwCount,
CONST HANDLE* phObjects,
BOOL fWaitAll,
DWORD dwMilliseconds
);
dwCount參數(shù)用于指明想要讓函數(shù)查看的內(nèi)核對象的數(shù)量。這個值必須在1與MAXIMU M_WAIT_OBJECTS(在Windows頭文件中定義為64)之間。
phObjects參數(shù)是指向內(nèi)核對象句柄的數(shù)組的指針。
可以以兩種不同的方式來使用WaitForMultipleObjects函數(shù)。
一種方式是讓線程進(jìn)入等待狀態(tài),直到指定內(nèi)核對象中的任何一個變?yōu)橐淹ㄖ獱顟B(tài)。
另一種方式是讓線程進(jìn)入等待狀態(tài),直到所有指定的內(nèi)核對象都變?yōu)橐淹ㄖ獱顟B(tài)。
fWaitAll參數(shù)告訴該函數(shù),你想要讓它使用何種方式。如果為該參數(shù)傳遞TRUE,那么在所有對象變?yōu)橐淹ㄖ獱顟B(tài)之前,該函數(shù)將不允許調(diào)用線程運(yùn)行。
dwMilliseconds參數(shù)的作用與它在WaitForSingleObject中的作用完全相同。如果在等待的時候規(guī)定的時間到了,那么該函數(shù)無論如何都會返回。。
WaitForMultipleObjects函數(shù)的返回值告訴調(diào)用線程,為什么它會被重新調(diào)度??赡艿姆祷刂凳荳AIT_FAILED和WAIT_TIMEOUT。如果為fWaitAl l參數(shù)傳遞TRUE,同時所有對象均變?yōu)橐淹ㄖ獱顟B(tài),那么返回值是WAIT_OBJECT_0。如果為fWaitAll傳遞FALSE,那么一旦任何一個對象變?yōu)橐淹ㄖ獱顟B(tài),該函數(shù)便返回。在這種情況下,你可能想要知道哪個對象變?yōu)橐淹ㄖ獱顟B(tài)。返回值是WAIT_OBJECT_0與(WAIT_OJECT_0 + dwCount-1)之間的一個值。換句話說,如果返回值不是WAIT_TIMEOUT,也不是WAIT_FAILED,那么應(yīng)該從返回值中減去WAIT_OBJECT_0。產(chǎn)生的數(shù)字是作為第二個參數(shù)傳遞給WaitForMultipleObjects的句柄數(shù)組中的索引。該索引說明哪個對象變?yōu)橐淹ㄖ獱顟B(tài)。
下面是說明這一情況的一些示例代碼
HANDLE h[3];
h[0] =hProcess1;
h[1] =hProcess2;
h[2] =hProcess3;
DWORD dw = WaitForMultipleObjects(3, h, FALSE,5000);
switch(dw)
{
case WAIT_FAILED:
// Bad call to function (invalid handle?)
break;
case WAIT_TIMEOUT:

// None of the objects became signaledwithin 5000 milliseconds.
break;
case WAIT_OBJECT_0 + 0:
// The process identified by h[0](hProcess1) terminated.
break;
case WAIT_OBJECT_0 + 1:
// The process identified by h[1](hProcess2) terminated.
break;
case WAIT_OBJECT_0 + 2:
// The process identified by h[2](hProcess3) terminated.
break;
}
fangyukuan/archive/2010/09/03/1817095.html
愛華網(wǎng)


