[Win32 Thread] WaitForSingleObject
WaitForSingleObject (等待一個執行緒的結束)
Win32 提供一個名為 WaitForSingleObJect() 的函式可以在某個執行緒結束時被喚起。它的第一個參數是個核心物件 (如執行緒) 的 handle。舉例來說 , 把即將等待的執行緒稱為執行緒 #1,把正在執行的執行緒稱為執行緒 #2。所指的執行緒核心物件」是執行緒#2。呼叫WaitForSingleObject()並放置一個 「執行緒核心物件」做為參數,將使執行緒 #1 開始睡眠,直到執行緒 #2 結束為止。就像 Sleep()函或一樣,WaitForSingleObject()也有一個參數用來指定最長的等待時間。
DWORD WaitForSingleObject(
HANDLE hHandle,
DWORD dwMilliseconds,
);參數
hHndle等待對象的handle (代表一個核心物件)。
dwMilliseconds等待的最長時間。時間終了,即使handle 尚未成為激發狀態,此函式還是要回返。此值可以是0 (代表立刻返),也可以是 INFINITE 代表無窮等待。
回返值
如果函式失敗,傳回WAIT_FAILED。這時候你可呼叫GetLastError() 取得更多資訊。此函式的成功有三個因素:
l﹒ 等待的目標(核心物件)變成激發狀態。此種情況下回返值將為
WAIT_OBJECT_O。
2. 核心物件變成激發狀態之前,等待時間終了。此種情況下回返值將為
WAITTIMEOUT。
3. 如果一個擁有 mutex(互斥器)的執行緒結束前沒有釋放mutex,則傳回
WAIT_ABANDONED。
獲得一個執行緒物件的handle 之後,WaitForSingleObject()要求作業系統讓執行緒 #1 睡覺,直到以下任何一種情況發生:
1.執行緒# 2結束
2.dwMillisecond,時間終了。此值係從函式呼叫後開始計算。
由於作業系統持續追蹤執行緒#2,即使執行緒 #2 被強迫結束WaitForSingleObject()仍然能夠正常運作。
關於 time-out,有一個特別重要的用途,但很少被人注意。設定 time-out為 0使你能夠檢查 handle的狀態並立刻回返,沒有片刻停留。handle已經備妥,那麼這個函式會成功並傳回WAIT_OBJECT_O。否則這函式立刻回返並傳回WAIT_TIMEOUT。
另有其他一些理由使你需要設定time-out 參數。最簡單的一個理由就是希望被黏住,特別是在除錯時。如果你所等待的執行緒進入了一個無窮迴圈你或許可以根據此函式的回返值以及time-out的終了與否,獲得警告
WaitForSingleObject()可以面對許多種 handles工作,事實上,Win32中大部份以HANDLE表示的物件都能夠做為WaitForSingleObject()的等待目標。視你所擁有的物件不同,作業系統等待的事情也不一樣。形式上來說,系統等待著這物件 「被激發」。
Comments
Post a Comment