WaitForSingleObject的用法
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 執行一次,當設置事件為有信號狀態時,線程就執行完畢了。