強調:
win32說明檔案一再強調執行緒分為gui執行緒和worker執行緒兩種。gui執行緒
負責建造視窗以及處理主訊息迴圈。worker 負責執行純粹運算工作,如重新
計算或重新編頁等等,它們會導致主線程的訊息佇列失去反應。一般而言,gui
執行緒絕不會去做那些不能夠馬上完成的工作。
gui執行緒的定義是:擁有訊息佇列的執行緒。任何乙個特定視窗的訊息總是
被產生這一視窗的執行緒抓到並處理。所有對此視窗的改變也都應該由該執行緒完
成。如果 worker 執行緒也產生了乙個視窗,那麼就會有乙個訊息佇列隨之被產
生出來並且附著到此執行緒身上,於是worker執行緒搖身一變成了gui執行緒。這
裡的意思是,worker 執行緒不能夠產生視窗、對話方塊、訊息框,或任何其他與
ui有關的東西。
所謂表面積,意指必須被執行緒共享的資料結構。要知道,程式愈是密切地與執行緒
有關係,愈是容易產生錯誤並發生race condition。
核心物件激發狀態的意義
:「激發」 signaled 對於不同的核心物件有不同的意義。
thread 執行緒,當執行緒結束時,執行緒物件即被激發。當執行緒還在進行時,則物件處於未激發狀態。
process 程序,當程序結束時,程序物件即被激發。當程序還在進行時,則物件處於未激發狀態。
主要函式:waitforsingleobject
函式原型:
dword waitforsingleobject(
handle hhandle,
dword dwmilliseconds
引數 :
hhandle 等待物件的 handle (代表乙個核心物件)。在本
例中,此為執行緒 handle 。
dwmilliseconds 等待的最長時間。時間終了,即使handle 尚未成
為激發狀態,此函式還是要返回。此值可以是 0
(代表立刻返回),也可以是 infinite 代表無
窮等待。
返回值:
如果函式失敗,則傳回wait_failed。這時候你可呼叫getlasterror() 取
1.等待的目標(核心物件)變成激發狀態。這種情況下返回值將為
wait_object_0。
2.核心物件變成激發狀態之前,等待時間終了。這種情況下返回值將為
wait_timeout。
3.如果乙個擁有 mu tex(互斥器)的執行緒結束前沒有釋放 mu tex,則傳
回 wait_ abandoned 。
如上所述,可以推出,函式等待至以下兩種情況之一發生
1:執行緒 #2 結束
2: dwmilliseconds 時間終了。該值系從函式呼叫後開始計算。
for (;;)
int rc;
rc = getexitcodethread(hthrd, &exitcode);
if (!rc && exitcode != still_active )
break;
這個 busy loop 現在可以被下面這行**取代了:
waitforsingleobject( hthrd, infinite );
一次只能等待乙個thread。
如果需要一次等待多個thread,則需要下面這個函式:
主要函式:waitformultipleobjects
函式原型:
dword waitformultipleobjects(
dword ncount, //handles 陣列的元素個數
const handle *lphandles, // handles 所組成的陣列
bool bwaitall, // true:所有執行緒激發時才返回;flase:任一線程啟用時返回。
引數:ncount 表示 lph andles 所指之handles 陣列的元素個
數。最大容量是 maximum_wait_objects 。
lphandles 指向乙個由物件 handles 所組成的陣列。這些
handles 不需要為相同的型別。
bwaitall 如果此為 true ,表示所有的 handles 都必須激
發,此函式才得以返回。否則此函式將在任何乙個
handle 激發時就返回。
dwmilliseconds 當該時間長度終了時,即使沒有任何handles 激
發,此函式也會返回。此值可為 0 ,以便測試。亦
可指定為 infinite ,表示無窮等待。
返回值:waitformultipleobjects() 的返回值有些複雜。
如果因時間終了而返回,則返回值是 wait_timeout ,類似 waitforsingleobject()。
如果bwaitall 是 true ,那麼返回值將是wait_object_0 。
如果bwaitall 是 false ,那麼將返回值減去wait_object_0,就
表示陣列中的哪乙個 handle 被激發了。
*如果你等待的物件中有任何 mu texes,那麼返回值可能從
wait_abandoned_0 到 wait_abandoned_0 + ncount - 1 。
如果函式失敗,它會傳回wait_failed 。這時候你可以使用
getlasterror() 找出失敗的原因。
Windows多執行緒程式設計
一 問題的提出 編寫乙個耗時的單執行緒程式 新建乙個基於對話方塊的應用程式singlethread,在主對話方塊idd singlethread dialog新增乙個按鈕,id為idc sleep six second,標題為 延時6秒 新增按鈕的響應函式,如下 void csinglethread...
windows多執行緒程式設計
程序 乙個執行的程式,記憶體,cpu時間等都歸程序所有.執行緒 cpu排程的最小單位,乙個程序內的多個執行緒共享4g記憶體.程式的乙個執行路徑 1.最基礎的使用方法.createthread,exitthread,closehand include include createthread,exit...
Windows多執行緒程式設計
函式原型 handlewinapi createthread lpsecurity attributes lpthreadattributes,size t dwstacksize,lpthread start routine lpstartaddress,lpvoid lpparameter,dw...