Posted on 2008-01-02 19:35
hongsion 阅读(2049)
评论(5) 编辑 收藏 引用 所属分类:
Windows
以下内容完全把window 操作系统当作一个黑盒,因此所有内容只能作为对其内部的一个猜测。
1. windows操作系统内部在创建一个线程的时候,会自动为它创建一个消息队列。
2.每当一个线程创建一个窗口的时候,操作系统内部都会把该窗口的Handle和线程相关联。很有可能在操作系统内部会维护一个窗口handle到线程的map. 还有一种可能就是窗口的成员变量里面有一个指针,指向创建它的线程。
3.窗口本身并没有消息队列,所有发到窗口的消息,都会自动被发到创建该窗口的线程的消息队列中。
4.每个线程只能处理自己线程队列里面的消息,不能处理其他线程消息队列里面的消息。
所以PeekMessage(LPMSG lpMsg, HWND hWnd, UINT,UINT,UINT)函数中,如果hWnd不是本线程创建的窗口,则该函数调用失败。
5.由于在线程消息队列里面的消息会包含有窗口句柄,所以PeekMessage可以专门处理某个特殊窗口的消息。
6. 曾经有疑问线程是不是只有创建了窗口才具有消息队列,但又觉得应该不是这样,因为在windows的API里面有个函数叫PostThreadMessage,可以直接把消息投递到线程的消息队列里面,而不需要任何窗口句柄。后来在MSDN里面有这么一段描述,觉得解释的很详细:
“The system maintains a single system message queue and one thread-specific message queue for each graphical user interface (GUI) thread. To avoid the overhead of creating a message queue for non–GUI threads, all threads are created initially without a message queue. The system creates a thread-specific message queue only when the thread makes its first call to one of the User or Windows Graphics Device Interface (GDI) functions".
这里唯一的疑问我想应该是”makes its first call to one of the User or Windows Graphics Device Interface (GDI) functions", 这句话的意思是不是等同于创建一个窗口呢?