【待完善】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消息机制

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