dwCount參數 用於指明想要讓函式查看的核心對象的數量。這個值必須在1與MAXIMUM_WAIT_OBJECTS(在Windows頭檔案中定義為64之間.
phObjects參數 是指向核心對象句柄的數組的指針。可以以兩種不同的方式來使用WaitForMultipleObjects函式。一種方式是讓執行緒進入等待狀態,直到指定核心對象中的任何一個變為已通知狀態。另一種方式是讓執行緒進入等待狀態,直到所有指定的核心對象都變為已通知狀態。
fWaitAll參數 告訴該函式,你想要讓它使用何種方式。如果為該參數傳遞TRUE,那么在所有對象變為已通知狀態之前,該函式將不允許調用執行緒運行。
dwMil liseconds參數 該參數的作用與它在WaitForSingleObject中的作用完全相同。如果在等待的時候規定的時間到了,那么該函式無論如何都會返回。同樣,通常為該參數傳遞INFINITE,但是在編寫代碼時應該小心,以避免出現死鎖情況。
WaitForMultipleObjects函式的返回值告訴調用執行緒,為什麼它會被重新調度。可能的返回值是WAIT_FAILED和WAIT_TIMEOUT,這兩個值的作用是很清楚的。如果為f WaitAll參數傳遞TRUE,同時所有對象均變為已通知狀態,那么返回值是WAIT_OBJECT_0。如果為fWaitAll傳遞FALSE,那么一旦任何一個對象變為已通知狀態,該函式便返回。在這種情況下,你可能想要知道哪個對象變為已通知狀態。返回值是WAIT_OBJECT_0與(WAIT_OBJECT_0 + dwCount-1)之間的一個值。換句話說,如果返回值不是WAIT_TIMEOUT,也不是WAIT_FAILED,那么應該從返回值中減去WAIT_OBJECT_0。產生的數字是作為第二個參數傳遞給WaitForMultipleObjects的句柄數組中的索引。該索引說明哪個對象變為已通知狀態。
附加一個淺顯的例子,以便大家更好的理解這個函式:
(注意:下面的例子還包含了執行緒優先權的設定。在VC6.0中用Win32控制台下調試通過。)
#include <windows.h>
#include <stdio.h>
DWORD WINAPI ThreadIdleProc(LPVOID lpParam)
{
int i = 0;
while(i++<10)
{
printf("Idle Thread is running.\n");
}
return 0;
}
DWORD WINAPI ThreadNormalProc(LPVOID lpParam)
{
int i = 0;
while (i++<10)
{
printf("Normal Thread is running.\n");
}
return 0;
}
int main(int argc,char* rgv[])
{
HANDLE h[2];
DWORD dwThreadID;
h[0] = ::CreateThread(NULL,0,ThreadIdleProc,NULL,CREATE_SUSPENDED,&dwThreadID);
::SetThreadPriority(h[0],THREAD_PRIORITY_IDLE);//設定執行緒優先權
::ResumeThread(h[0]);//喚醒
h[1] = ::CreateThread(NULL,0,ThreadNormalProc,NULL,CREATE_SUSPENDED,&dwThreadID);//CREATE_SUSPENDED設定為0是標示立刻執行,則不需要下面的兩個函式
::SetThreadPriority(h[1],THREAD_PRIORITY_NORMAL);
::ResumeThread(h[1]);
DWORD dw;
//第3、4個參數設定為TRUE、INFINITE時,等待所有執行緒執行完畢才返回,
//為如下設定時,只要有一個執行緒為可信狀態就返回
dw = ::WaitForMultipleObjects(2,h,FALSE,5000);
switch(dw)
{
case WAIT_FAILED:
break;
case WAIT_TIMEOUT:
break;
case WAIT_OBJECT_0:
break;
case WAIT_OBJECT_0+1:
break;
default:;
}
::CloseHandle(h[0]);
::CloseHandle(h[1]);
return 0;
}