windows消息機制

轉載http://blog.csdn.net/nimittz/article/details/540493

windows的所謂事件驅動核心是消息!

消息分爲進隊消息消息和非進隊消息。所謂進隊消息就是windows將消息發送到每個線程所專有的隊列中,然後由程序自主處理,這種消息基本上是由用戶輸入產生(wm_keydown,wm_keyup,wm_char,wm_mouse**,以及wm_paint,wm_timer,wm_quit)或者是調用postmessage,postthreadmessage產生的消息;所謂的非進隊消息就是直接發送給窗口過程的消息,就是直接調用窗口過程,上述消息以外的一般都是這種類型!

一個線程一旦建立了至少一個窗口,則系統就爲其分配一個消息隊列。主要表現形式爲系統爲其分配一個THREADINFO結構,該結構有四個指針分別指向登記消息隊列,發送消息隊列,應答消息隊列和虛擬輸入隊列。如果想將消息放入登記消息隊列,可以調用postmessage,或者postthreadmessage。其餘的消息隊列主要用於處理如下的事務。當某線程調用sendmessage給別的線程創建的窗口時,發送的消息首先追加到接收線程的發送消息隊列,發送線程處於空閒狀態,等待接收線程處理完他的消息返回給發送線程的應答隊列,等到後發送線程被喚醒取得應答隊列的消息(就是處理完消息的返回值),繼續執行。而虛擬輸入隊列則是由windows的系統線程RIT(原始輸入線程)負責將硬件事件轉換成消息添加到對應線程的虛擬消息隊列中。

處理消息隊列的順序。首先windows絕對不是按隊列先進先出的次序來處理的,而是有一定優先級的。優先級通過消息隊列的狀態標誌來實現的。首先最高優先級的是別的線程發過來的消息(通過sendmessage),其次是處理登記消息隊列消息,再次處理QS_QUIT標誌,再處理虛擬輸入隊列,再處理wm_paint最後是wm_timer!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章