c++執行緒學習5等待函式
WaitForSingleObject的用法
DWORD WaitForSingleObject(
HANDLE hHandle,
DWORD dwMilliseconds
);
引數hHandle是一個事件的控制代碼,第二個引數dwMilliseconds是時間間隔。如果時間是有訊號狀態返回WAIT_OBJECT_0,如果時間超過dwMilliseconds值但時間事件還是無訊號狀態則返回WAIT_TIMEOUT。
hHandle可以是下列物件的控制代碼:
Change notification
Console input
Event
Job
Memory resource notification
Mutex
Process
Semaphore
Thread
Waitable timer
WaitForSingleObject函式用來檢測hHandle事件的訊號狀態,當函式的執行時間超過dwMilliseconds就返回,但如果引數dwMilliseconds為INFINITE時函式將直到相應時間事件變成有訊號狀態才返回,否則就一直等待下去,直到WaitForSingleObject有返回直才執行後面的程式碼。在這裡舉個例子:
先建立一個全域性Event物件g_event:
CEvent g_event;
在程式中可以通過呼叫CEvent::SetEvent設定事件為有訊號狀態。
下面是一個執行緒函式MyThreadPro()
UINT CFlushDlg::MyThreadProc( LPVOID pParam )
{
WaitForSingleObject(g_event,INFINITE);
For(;;)
{
}
return 0;
}
在這個執行緒函式中只有設定g_event為有訊號狀態時才執行下面的for迴圈,因為g_event是全域性變數,所以我們可以在別的執行緒中通過g_event. SetEvent控制這個執行緒。
還有一種用法就是我們可以通過WaitForSingleObject函式來間隔的執行一個執行緒函式的函式體
UINT CFlushDlg::MyThreadProc( LPVOID pParam )
{
while(WaitForSingleObject(g_event,MT_INTERVAL)!=WAIT_OBJECT_0)
{
}
return 0;
在這個執行緒函式中可以可以通過設定MT_INTERVAL來控制這個執行緒的函式體多久執行一次,當事件為無訊號狀態時函式體隔MT_INTERVAL執行一次,當設定事件為有訊號狀態時,執行緒就執行完畢了。
2)簡單說明WaitForSingleObject
DWORD WaitForSingleObject(HANDLE hObject,DWORD dwMilliseconds);
引數hObject:要等待的核心物件的控制代碼。
引數dwMilliseconds: 設定的等待超時的時間,以毫秒為單位。可以設定為INGINIT。
順便說一下,INFINITE已經定義為0xFFFFFFFF(或-1)。當然,傳遞INFINITE有些危險。如果物件永遠不變為已
通知狀態,那麼呼叫執行緒永遠不會被喚醒,它將永遠處於死鎖狀態。
返回值:WAIT_OBJECT_0表示要等待的物件已經變為已通知的狀態。
WAIT_TIMEOUT表示設定的時間超時。
WAIT_FAILED表示失敗,可能是傳入的handle不正確或其他的問題。
DWORD dw = WaitForSingleObject(hProcess, 5000);
switch(dw)
{
case WAIT_OBJECT_0:
// The process terminated.
break;
case WAIT_TIMEOUT:
// The process did not terminate within 5000 milliseconds.
break;
case WAIT_FAILED:
// Bad call to function (invalid handle?)
break;
}
3)簡單說明WaitForMultipleObjects
DWORD WaitForMultipleObjects(DWORD dwCount,CONST HANDLE* phObjects,BOOL fWaitAll,DWORD dwMilliseconds);
引數dwCout:需要等待的核心物件的數量。
引數phObjects:需要等待的核心物件的是陣列的指標。
引數fWaitAll:表示是否需要等待所有的核心物件。
引數dwMilliseconds:設定等待超時的時間。(同上函式)
返回值:WAIT_FAILED和WAIT_TIMEOUT同上函式。
如果為fWaitAll引數傳遞TRUE,同時所有物件均變為已通知狀態,那麼返回值是WAIT_OBJECT_0。如果為fWaitAll傳遞FALSE ,那麼一旦任何一個物件變為已通知狀態,該函式便返回。在這種情況下,你可能想要知道哪個物件變為已通知狀態。返回值是WAIT_OBJECT_0與(WAIT_OBJECT_0+dwCount- 1)之間的一個值。
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 signaled within 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;
}