WaitForSingleObject

WaitForSingleObject

WaitForSingleObject是一種Windows API函數,當等待仍在掛起狀態時,句柄被關閉,那麼函數行為是未定義的。該句柄必須具有 SYNCHRONIZE 訪問許可權。

WaitForSingleObject函數用來檢測hHandle事件的信號狀態,在某一線程中調用該函數時,線程暫時掛起,如果在掛起的dwMilliseconds毫秒內,線程所等待的對象變為有信號狀態,則該函數立即返回;如果超時時間已經到達dwMilliseconds毫秒,但hHandle所指向的對象還沒有變成有信號狀態,函數照樣返回。

對應函數


VC聲明
DWORD WaitForSingleObject(
WaitForSingleObject
WaitForSingleObject
HANDLE hHandle,
DWORD dwMilliseconds
);
VB聲明
Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long

說明


DWORD WINAPI WaitForSingleObject(
__in HANDLE hHandle,
__in DWORD dwMilliseconds
);

參數


hHandle[in]對象句柄。可以指定一系列的對象,如Event、Job、Memory resource notification、Mutex、ProcessSemaphore、Thread、Waitable timer等。
dwMilliseconds[in]定時時間間隔,單位為milliseconds(毫秒).如果指定一個非零值,函數處於等待狀態直到hHandle標記的對象被觸發,或者時間到了。如果dwMilliseconds為0,對象沒有被觸發信號,函數不會進入一個等待狀態,它總是立即返回。如果dwMilliseconds為INFINITE,對象被觸發信號后,函數才會返回。

返回值


執行成功,返回值指示出引發函數返回的事件。它可能為以下值:
WAIT_ABANDONED0x00000080L
The specified object is a mutex object that was not released by the thread that owned the mutex object before the owning thread terminated. Ownership of the mutex object is granted to the calling thread and the mutex state is set to nonsignaled.
If the mutex was protecting persistent state information, you should check it for consistency.
WAIT_OBJECT_00x00000000LThe state of the specified object is signaled.
WAIT_TIMEOUT0x00000102LThe time-out interval elapsed, and the object's state is nonsignaled.
WAIT_FAILED(DWORD)0xFFFFFFFFThe function has failed. To get extended error information, call GetLastError.
參數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()
在這個線程函數中只有設置g_event為有信號狀態時才執行下面的for循環,因為g_event是全局變數,所以我們可以在別的線程中通過g_event. SetEvent控制這個線程。
還有一種用法就是我們可以通過WaitForSingleObject函數來間隔的執行一個線程函數的函數體
在這個線程函數中可以通過設置MT_INTERVAL來控制這個線程的函數體多久執行一次,當事件為無信號狀態時函數體隔MT_INTERVAL執行一次,當設置事件為有信號狀態時,線程就執行完畢了。