首页 理论教育 操作系统实现之路-消息传递详细过程

操作系统实现之路-消息传递详细过程

时间:2023-10-21 理论教育 版权反馈
【摘要】:消息传递的详细过程,在本章11.8节中将详细介绍,这里只介绍消息传递过程中,如何通过窗口树找到消息的归属窗口。下面是以深度优先算法搜索窗口树的部分代码:显然,这是个递归函数,这个函数的执行过程是:首先检查子窗口,如果消息落在子窗口内,则返回子窗口的对象句柄,否则认为落在了父窗口内。但这需要读者对递归函数的调用过程非常清楚,否则可能会对这一段代码感到迷惑。

操作系统实现之路-消息传递详细过程

窗口树是窗口机制中核心的数据结构,系统中的所有窗口,不论其归属核心线程是否相同,都会被连接到这一棵全局的树结构中。窗口对象中的四个指针(parent、child、next sibling和previous sibling),把窗口组织成一个树形结构。pParent和pChild,组成窗口树的层次结构,而pPrevSibling和pNextSibling,则组成相同级别的链表结构,即所有具有兄弟关系(父窗口相同)的窗口,组成一个双向链表,如图11-13所示。

978-7-111-41444-5-Chapter11-49.jpg

图11-13 窗口树

在调用CreateWindow创建窗口的时候,需要指定一个父窗口对象句柄(下列代码中的黑体变量),这个句柄就是所创建窗口的父窗口:

978-7-111-41444-5-Chapter11-50.jpg

如果在创建窗口的时候,把hParent指定为NULL,则系统会把祖先窗口(GUI模块初始化过程中创建的第一个窗口)作为其父窗口。除了祖先窗口,系统中的任何一个窗口都有一个父窗口。

窗口树的最重要的用途,就是用于实现消息的有效传递。消息传递的详细过程,在本章11.8节中将详细介绍,这里只介绍消息传递过程中,如何通过窗口树找到消息的归属窗口。在搜索消息的归属窗口时,是按照消息位置(比如鼠标点击消息,其位置就是在屏幕上的坐标)检索整个窗口树的。在检索的时候,是按照深度优先的顺序进行的,即一个窗口的子窗口优先被检查。这很容易理解,比如在图11-14所示的窗口层叠关系中,鼠标点击消息应该传递给子窗口,而不是父窗口。

978-7-111-41444-5-Chapter11-51.jpg

图11-14 消息应该被传递给子窗口

在窗口树中,子窗口位于父窗口的下面,即更深的位置,因此采用深度优先的搜索算法,可确保消息被传递给子窗口。下面是以深度优先算法搜索窗口树的部分代码:

978-7-111-41444-5-Chapter11-52.jpg

978-7-111-41444-5-Chapter11-53.jpg(www.xing528.com)

显然,这是个递归函数,这个函数的执行过程是:首先检查子窗口,如果消息落在子窗口内,则返回子窗口的对象句柄,否则认为落在了父窗口内。同时对于相同层级的兄弟窗口,则是链表前面的窗口被优先匹配。相信这个函数的代码,会比文字描述更加清楚。但这需要读者对递归函数的调用过程非常清楚,否则可能会对这一段代码感到迷惑。不过不要紧,即使递归调用对读者来说是个障碍,也无需沮丧,只要记住,在搜索消息的目标窗口时是深度优先的,即消息如果既落入了父窗口的覆盖范围,又落入了子窗口的覆盖范围,则优先传递给子窗口。

上面是对窗口树的纵向分析,以深度优先为原则。在窗口树的横向处理上,即兄弟窗口之间,也必须维持一种优先关系,否则也会产生混乱。比如图11-15所示这个窗口关系。

978-7-111-41444-5-Chapter11-54.jpg

图11-15 窗口消息的横向传递

子窗口1和子窗口2是兄弟关系,但是在兄弟链表中,子窗口1却位于子窗口2之前。这样如果在上图所示位置点击了鼠标,则消息可能会被错误地传递到子窗口1,而不是子窗口2。要解决这个问题,必须确保子窗口2在兄弟列表中,位于子窗口1之前。

要达到这个目的,只需要定义一条规则即可:在兄弟链表中,处于焦点状态(图中子窗口2)的窗口,总是位于链表的第一个位置。这样就可确保任何消息,都会被传递到正确的窗口。要满足这个原则,只需要在窗口的焦点状态改变时,同时变更其在兄弟链表中的位置即可。图11-16说明了这个过程。

978-7-111-41444-5-Chapter11-55.jpg

图11-16 窗口焦点状态与在兄弟链表中的位置

开始的时候,窗口3是焦点窗口,于是在兄弟链表中,窗口3排在第一的位置。这时候用户用鼠标点击了窗口2,于是窗口2变成了焦点窗口。这样必须同时修改兄弟链表,使窗口2位于链表的第一个位置。

通过这样的一种顺序调整,就可确保我们设定的原则的达成。这样结合窗口树的深度优先原则,就可实现消息的准确传递。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈