UI執行緒訊息處理過程

2021-05-21 23:27:26 字數 1819 閱讀 5124

只有在使用

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...