【待完善】windows消息機制

GUI線程負責建造窗口以及處理主消息循環。

GUI線程的定義是:擁有消息隊列的線程。任何一個特定窗口的消息總是被產生這一窗口的線程抓到並處理。所有對此窗口的改變也都應該由該線程完成。

在Win32中,每一個線程有它自己專屬的消息隊列。這並不意味着每一個窗口有它自己的消息隊列,因爲一個線程可以產生許多窗口。如果一個線程停止迴應,或是它忙於一段耗時的計算工作,那麼由它產生的窗口統統都會停止迴應,但系統中的其他窗口還會繼續正常工作。

所有傳送給某一窗口之消息,將由產生該窗口之線程負責處理。

每一個GUI線程都會維護這樣一個線程消息隊列。(這個隊列只有在線程調用 User 或者 GDI 函數時纔會創建,默認並不創建)。然後線程消息隊列中的消息會被本線程的消息循環(有時也被稱爲消息泵)派送到相應的窗口過程(也叫窗口回調函數)處理

 

當需要發送一個消息時,Windows會自動計算出哪一個線程應該接收到消息(以便確定該消息實體應該掛在在哪一個線程的消息隊列中)。同時,windows還會確定線程應該如何被告知有這麼一個消息進來。一共有四種可能:
(1)如果屬於同一線程,使用SendMessage傳遞消息,則直接調用窗口函數。
(2)如果屬於同一線程,使用PostMessage傳遞消息,則把消息放在消息隊列中然後立即返回。
(3)如果不屬於同一線程,使用SendMessage傳遞消息,則切換到新線程中並調用窗口函數。在該窗口函數結束之前,SendMessage不會返回。
(4)PostMessage立刻返回,消息則被放到另一線程的消息隊列中。
當我send一個消息給另一線程掌握的窗口時,系統必須做一次context switch,切換到另一線程去,調用該窗口函數,然後再做一次context switch切換回來,相對一般的函數調用而言,期間的額外負擔較大。如果在MDI中,爲每個子窗口分配一個線程,那麼該子窗口的所有資源——包括畫刷,DC,調色板等等都屬於線程的資源。此時爲線程做context switch時會代價很大。

什麼是GUI線程????

每個窗口都有一個自己的窗口處理函數????DispatchMessage消息時時怎麼確定發給哪個窗口處理函數(窗口回調函數)的?

一個應用程序只能有一個消息循環嗎?

一個應用程序只能有一個消息隊列嗎?

一個消息隊列對應一個消息循環嗎?

typedef struct tagMSG
{
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;
}MSG;

其中hwnd 是窗口的句柄,這個參數將決定由哪個窗口過程函數對消息進行處理;message是一個消息常量,用來表示消息的類型;wParam 和lParam 都是32 位的附加信息,具體表示什麼內容,要視消息的類型而定;time 是消息發送的時間;pt 是消息發送時鼠標所在的位置。

就是說,一個GUI線程可以產生多個窗口,而每一個GUI線程都會維護一個線程消息隊列。

參考:

https://blog.csdn.net/xie_dream/article/details/7738965 關於GUI線程和worker線程。

 

http://www.jizhuomi.com/software/145.html MFC應用程序框架分析(包括消息循環)

https://blog.csdn.net/csx66406602/article/details/54314115 GetMessage

https://blog.csdn.net/u011392772/article/details/52705562 SendMessage與PostMessage的區別

 

https://www.cnblogs.com/skyofbitbit/p/3649104.html windows消息機制淺析

https://blog.csdn.net/mao834099514/article/details/74841633 windows消息機制概述(一)

https://blog.csdn.net/mao834099514/article/details/74842436 windows消息機制概述(二)

https://www.cnblogs.com/zhoug2020/p/6239018.html windows消息機制詳解

https://blog.csdn.net/sun222555888/article/details/80630819 圖解windows消息機制

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