您的位置:首页 > 其它

Windows是不是每个线程都有消息队列的问题

2011-09-04 21:17 246 查看
今天从网上搜集了下,加上试了一个小程序,感觉下面的一种说法是比较准确地。/article/6924047.html

在Windows应用程序中,操作系统会监控计算机上的键盘和鼠标等输入设备,为每一个输入事件(由用户操作所引发,比如用户按了某个键)生成一个消息。根据事件发生时的情况(比如当前 激活的窗体负责接收用户按键,而依据用户点击鼠标的坐标可以知道用户在哪个窗体区域内点击了鼠标),操作系统会确定出此消息应该发给哪个窗体对象。

这些生成的消息会统一地先临时放置在一个“系统消息队列(system message queue)”中,然后,操作系统有一个专门的线程负责从这一队列中取出消息,根据消息的目标对象(就是窗体的句柄),将其移动到创建它的UI线程所对应的消息队列中。操作系统在创建进程和线程时,都同时记录了大量的控制信息(比如通过进程控制块和句柄表可以查找到进程所创建的所有线程和引用的核心对象),因此,根据窗体句柄来确定此消息应属于哪个UI线程对于操作系统来说是很简单的一件事。

注意,每个UI线程都有一个消息队列,而不是每个窗体一个消息队列!

那么,操作系统是不是会为每一个线程都创建一个消息队列呢?

答案是:只有当一个线程调用Win32 API中的GDI(Graphics Device Interface)和User函数时,操作系统才会将其看成是一个UI线程,并为它创建一个消息队列。

需要注意的是,消息循环是由UI线程的线程函数启动的,操作系统不管这件事,它只管为UI线程创建消息队列。因此,如果某个UI线程的线程函数中没有定义消息循环,那么,它所拥有的窗体是无法正确绘制的。

所谓消息循环,其实就是一个While循环语句罢了。

“窗体过程”不过就是一个多分支语句罢了

UI线程启动一个消息循环,每次从本线程所对应的消息队列中取出一条消息,然后根据消息所包容的信息,将其转发给特定的窗体对象,此窗体对象所对应的“窗体过程”函数被调用以处理这些消息。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: