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有返回值才執行后面的代碼。此外,當dwMilliseconds設置為特殊值0時,測試hHandle核心對象是否被激發,函數立即返回。
返回值:
WAIT_ABANDONED:當hHandle為mutex時,如果擁有mutex的線程在結束時沒有釋放核心對象會引發此返回值。
WAIT_OBJECT_0:核心對象已被激活
WAIT_TIMEOUT:等待超時
WAIT_FAILED:出現錯誤,可通過GetLastError得到錯誤代碼
先創建一個全局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執行一次,當設置事件為有信號狀態時,線程就執行完畢了。