WaitForSingleObject用法,waitforsingleobject
對應函數
編輯
VC聲明
DWORD WaitForSingleObject(
HANDLE hHandle,
DWORD dwMilliseconds
);
參數
編輯
hHandle[in]對象句柄。可以指定一系列的對象,如Event、Job、Memory resource notification、Mutex、Process、Semaphore、Thread、Waitable timer等。
dwMilliseconds[in]定時時間間隔,單位為milliseconds(毫秒).如果指定一個非零值,函數處於等待狀態直到
hHandle標記的對象被觸發,或者時間到了。如果
dwMilliseconds為0,對象沒有被觸發信號,函數不會進入一個等待狀態,它總是立即返回。如果
dwMilliseconds為INFINITE,對象被觸發信號後,函數才會返回。
WaitForSingleObject函數用來檢測hHandle事件的信號狀態,在某一線程中調用該函數時,線程暫時掛起,如果在掛起的dwMilliseconds毫秒內,線程所等待的對象變為有信號狀態,則該函數立即返回;如果超時時間已經到達dwMilliseconds毫秒,但hHandle所指向的對象還沒有變成有信號狀態,函數照樣返回。參數dwMilliseconds有兩個具有特殊意義的值:0和INFINITE。若為0,則該函數立即返回;若為INFINITE,則線程一直被掛起,直到hHandle所指向的對象變為有信號狀態時為止。
WAIT_ABANDONED 0x00000080:當hHandle為mutex時,如果擁有mutex的線程在結束時沒有釋放核心對象會引發此返回值。
WAIT_OBJECT_0 0x00000000 :指定的對象出有有信號狀態
WAIT_TIMEOUT 0x00000102:等待超時
WAIT_FAILED 0xFFFFFFFF :出現錯誤,可通過GetLastError得到錯誤代碼
在這裡舉個例子:
先創建一個全局Event對象g_event:
CEvent g_event;
在程序中可以通過調用CEvent::SetEvent設置事件為有信號狀態。
下面是一個線程函數MyThreadProc()
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執行一次,當設置事件為有信號狀態時,線程就執行完畢了。