MFC開發,如何獲取子線程的狀態,確保子線程只有在掛起的狀態下才會被激活?
不管是Windows API還是MFC的CWinThread類都沒有給出直接獲得線程狀態的接口或函數。線程的狀態分為正在執行、掛起、已經結束三種。利用API函數GetExitCodeThread()時獲得的返回碼只能判定線程是活著的還是已經結束了,這裡“活著的”指的是正在執行或掛起狀態。那麼如果一個線程還活著,怎樣鑒別一個線程是正在執行還是正在掛起呢???令人遺憾的是,微軟沒有給出直接的接口函數。
既然WindowsAPI和MFC都沒給出直接返回線程狀態的接口函數,還好MFC裡有兩個函數SuspendThread()和ResumeThread()。
微軟給每個線程維護著一個叫做掛起次數計數器的東西,這個在上面兩個函數中有大用處。
SuspendThread()是使線程掛起,調用後,返回該次調用之前的掛起計數值,然後掛起計數值加1。如果返回為0,則表示線程原先正在執行,現在進入掛起狀態。
而ResumeThread()是使線程喚醒,調用該函數後,線程此時並不一定能擺脫掛起狀態。調用該函數後,返回該次調用之前的掛起計數值,然後掛起計數值減1,如果是原先掛起計數值已經為0則保持0值。如果返回值為1,則表示線程原先被掛起,現在轉入正在執行狀態。如果返回為0,則表示線程原先就處於正在執行狀態,現在也繼續執行。當返回值大於1時,掛起技術值減1,但線程將依舊被掛起,在這種情況下,只有繼續調用幾次該函數制止返回值為1,線程才能拜托掛起繼續執行。