只有在使用
mfc框架時才有
ui執行緒和工作者執行緒之分。
ui執行緒與工作者執行緒的區別是作業系統為
ui執行緒建立並維護了乙個訊息佇列。
其實執行緒在建立時(無論是
api還是
mfc),都是工作者執行緒。當執行緒呼叫傳送訊息或提取訊息或圖形使用者介面相關的函式時,系統才為其建立乙個訊息佇列
和threadinfo
結構,這時的執行緒才稱為
ui執行緒。
vc開發的控制台程式的主線程是工作執行緒,其他程式的主線程為
ui執行緒。
_beginthreadex/createthread
等函式建立的執行緒預設為工作執行緒,
afxbeginthread
可以根據引數建立工作者執行緒和
ui執行緒。
1
從使用者輸入到系統訊息佇列
作業系統會監視計算機的鍵盤和滑鼠等輸入裝置,為每乙個輸入事件生成乙個訊息,將訊息統一臨時放到「系統訊息佇列」內。其中訊息的視窗控制代碼由系統根據滑鼠或游標所在區域計算出的。
2
從系統訊息佇列到執行緒訊息佇列
系統有專門的執行緒負責從系統訊息佇列中取出訊息,根據訊息的目標物件(視窗控制代碼),將訊息投遞到建立它的
ui執行緒對應的訊息佇列中。每個
ui執行緒有且僅有乙個訊息佇列。
3 ui
執行緒處理訊息
ui
執行緒啟動乙個訊息迴圈(
message loop
),每次從本執行緒所對應的訊息佇列中取出一條訊息,然後根據訊息所包容的資訊,將其**給特定的窗體物件,此窗體物件所對應的「窗體過程」函式被呼叫以處理這些訊息。
msg msg; //
代表一條訊息
bool bret;
// 從
ui執行緒訊息佇列中取出一條訊息
while( (bret = getmessage( &msg, null, 0, 0 )) != 0)
else
}getmessage()
等到有訊息才返回,
peekmessage()
則馬上返回訊息或空值;
getmessage()
獲得訊息後從佇列中刪除(
wm_paint
除外),
peekmessage()
則根據引數
pm_noremove
或pm_remove
來決定要不要刪除。
translatemessage()
函式主要用於將
wm_keydown
和wm_keyup
訊息轉換
wm_char
訊息。所以如果要截獲
wm_keydown
和wm_keyup
訊息,需要過載窗體類的
pretranslatemessage()
函式進行分析。
dispatchmessage()
函式根據取出的訊息中所包含的窗體控制代碼,將這一訊息**給引此控制代碼所對應的窗體物件。負責響應訊息的函式稱為窗體過程(
window procedure
)。如果需要自定義處理,則過載窗體類的
defwindowproc()
函式。窗體過程是乙個函式,每個窗體乙個,形式如下:
lresult callback mainwndproc(……)
//……
}
USB host處理過程
在usbh core.c中有乙個函式usbh process 這個函式很重要,main 函式每迴圈一次,它就執行一次,它處理所有usb核心狀態的變化,typedef enum host state 根據這個當前狀態 phost gstate 處於以上哪個狀態的不同,做出不同的處理過程。其中最重要的要...
Hadoop map reduce處理過程
1 在hadoop中,每個mapreduce任務都被初始化為乙個job。每個job又可以分成兩個階段 map階段和reduce階段 map函式接受乙個形式的輸入,然後同樣產生乙個形式的中間輸出,hadoop會負責將所有具有相同結果中間key值的value集合到一起傳給reduce函式,reduce函...
Openstack nova api 處理過程
乙個python函式示例 乙個python類的示例 所有的web請求引數都被封裝在environ這個dictionary中,start response函式讓人難以理解,其主要作用是設定reponse的http返回碼和http header.返回的list的乙個item對應於http respons...