Win32 提供WaitForSingleObject()函數,其第一個參數是一個核心對象(如線程)的 handle。為方便討論,把等待線程稱為線程#1,把被等待線程稱為線程#2。
調用 WaitForSingleObject()並放置一個“線程句柄”作為參數,將使線程#1開始睡眠,直到線程#2結束。像Sleep()函數一樣,WaitForSingleObject()也有一個參數用來指定最長的等待時間。
DWORD WaitForSingleObject(
HANDLE hHandle,
DWORD dwMilliseconds
);
hHandle:等待對象的 handle(代表一個核心對象)。
dwMilliseconds:等待的最長時間。時間終了,即使 handle尚未成為激發狀態,此函數也要返回。此值可以是0(代表立刻返回),也可以是 INFINITE代表無窮等待。
如果函數失敗,返回WAIT_FAILED。這時可調用 GetLastError()取得更多信息。
此函數的成功有三個因素:
1. 等待的目標(核心對象)變成激發狀態。返回值為WAIT_OBJECT_0。
2. 核心對象變成激發狀態之前,等待時間終了。返回值為WAIT_TIMEOUT。
3. 如果一個擁有mutex(互斥器)的線程結束前沒有釋放mutex,則傳回 WAIT_ABANDONED。(abandoned:廢棄)
獲得一個線程對象的 handle之后,WaitForSingleObject()要求操作系統讓線程 #1 睡眠,直到以下任何一種情況發生:
1. 線程#2結束
2. dwMilliseconds時間終了。該值系從函數調用后開始計算。
由於操作系統持續追蹤線程#2,即使線程#2 失事或被強迫結束,WaitForSingleObject()仍然能夠正常運作。
如果想一直等待某個線程,直到線程退出,可以用如下代碼:
WaitForSingleObject( hThrd, INFINITE );
關於time-out,有一個特別重要的用途,但很少被人注意。設定time-out為0,能夠檢查handle的狀態並立刻返回,沒有片刻停留。如果handle已經備妥,那么這個函數會成功並傳回 WAIT_OBJECT_0。否則,這個函數立刻返回並傳回 WAIT_TIMEOUT。
另外可以利用 time-out提供一個動畫,表示正在等待某個線程的結束。可以每 500毫秒就time-out一次,更新圖示,然后再繼續等待。
WaitForSingleObject()可以面對許多種 handles工作,不一定非要是的線程 handle。事實上,Win32中大部分以HANDLE表示的對象都能夠作為 WaitForSingleObject()的等待目標。視所擁有的對象不同,操作系統等待的事情也不一樣。形式上來說,系統等待着這一對象“被激發”。
【學習資料】 《Win32多線程程序設計》