wince 等待函數
等待函數是使一個(gè)線(xiàn)程自愿進(jìn)入等待狀態(tài),直到指定的內核對象被出發(fā)為止。注意如果線(xiàn)程在調用的一個(gè)等待函數的時(shí)候,相應的內核對象已經(jīng)處于觸發(fā)狀態(tài),那么線(xiàn)程是不會(huì )進(jìn)入等待狀態(tài)的。等待函數經(jīng)常用來(lái)阻塞線(xiàn)程來(lái)進(jìn)行同步,在IST中用到來(lái)等待相應的中斷事件。常用的等待函數是:WaitForSingleObject()。函數原型如下:
本文引用地址:http://dyxdggzs.com/article/201609/304604.htmDWORD WaitForSingleObject(
HANDLE hObject,
DWORD dwMilliseconds);
第一個(gè)參數hObject代表要等帶的內核對象,第二個(gè)參數dwMilliseconds代表要等待的毫秒數。如果到等待的時(shí)間到達,內核對象還沒(méi)有被觸發(fā),則函數返回等待超時(shí)。
在wince中可以用來(lái)被等待的內核對象有:進(jìn)程,線(xiàn)程,作業(yè),文件以及控制臺的標準輸入流/輸出流/錯誤流,事件,可等待的計時(shí)器,信號量,互斥量。其中事件,可等待的計時(shí)器,信號量以及互斥量是windows提供的專(zhuān)門(mén)用來(lái)線(xiàn)程同步的內核對象。
對第二個(gè)參數經(jīng)常傳遞INFINITE,就是0xFFFFFFFF(-1)。當傳遞INFINITE的時(shí)候代表如果等待的內核對象永遠不被觸發(fā),那么調用的線(xiàn)程就永遠不會(huì )被喚醒,它會(huì )一直等待下去。當然在等待的過(guò)程中并沒(méi)有占用CPU。
函數的返回值代表為什么調用線(xiàn)程又能夠繼續執行(線(xiàn)程進(jìn)入就緒狀態(tài))。
WAIT_OBJECT_0:代表等待的內核對象被觸發(fā)。
WAIT_TIMEOUT:代表等待超時(shí)。
WAIT_FAILED:代表傳入的無(wú)效的參數,這時(shí)調用GetLastError可以獲得更為詳細的信息。
WaitForSingleObject是等帶一個(gè)內核對象被觸發(fā)。而WaitForMultipleObjects允許調用線(xiàn)程同時(shí)檢查多個(gè)內核對象的觸發(fā)狀態(tài),其函數原型如下:
DWORD WaitForMultipleObjects(
DWORD dwCount,
CONST HANDLE * phObjects,
BOOL bWaitAll,
DWORD dwMilliseconds);
dwCount表示我們要檢測的內核對象的個(gè)數。這個(gè)值必須在1-MAXIMUM_WAIT_OBJECTS之間。phObjects是一個(gè)指針,指向一個(gè)內核對象句柄的數組。bWaitALL為T(mén)RUE時(shí)表示要等所有的內核對象都被觸發(fā),為FALSE時(shí)表示所等待的內核對象中有一個(gè)被觸發(fā)時(shí),線(xiàn)程就會(huì )被喚醒。最后一個(gè)參數與WaitForSingleObject中的那個(gè)一樣。
WaitForMultipleObjects函數的返回值告訴調用函數為什么它能過(guò)繼續運行??梢苑祷氐闹蛋╓AIT_FAILED和WAIT_TIMEOUT。
如果bWaitAll為T(mén)rue而且所有的對象都被觸發(fā)了,那么返回值是WAIT_OBJECT_0.
如果bWaitAll為False,那么只要任何一個(gè)對象被觸發(fā),函數就會(huì )立刻返回。這時(shí)返回值是WAIT_OBJECT_0和WAIT_OBJECT_0+dwCount-1中間的任何一個(gè)值,即我們在第二個(gè)參數中傳遞給函數的句柄數組的一個(gè)索引,用來(lái)告訴我們被觸發(fā)的是哪個(gè)對象。
評論