首页 > 代码库 > 再战MFC中的消息机制
再战MFC中的消息机制
时间一长就忘记MFC中的很多东西了,所以需要把这些基本的知识理一理,为能深入到MFC内部结果原理,现在需要把这些东西让度娘吐出来:
1.MFC中的消息队列情况(一个消息队列可以容纳多少消息)
原文可以在msdn中搜索“About Messages and Message Queues ”找到:
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.
windows维护着一个系统消息队列,以及分别为每个GUI线程维护一个各自的线程消息队列。为了避免非GUI线程的创建线程消息队列的开销,所有线程创建初始化时,均不创建消息队列。只有当线程第一次调用GDI函数时,系统才会为线程创建消息队列。所以那些非GUI线程是没有消息队列的。
////////////////综合以上我自己的理解
1)线程的前世和今生
系统消息队列由Windows维护,线程消息队列则由每个GUI线程自己进行维护,为避免给non-GUI现成创建消息队列,所有线程产生时并没有消息队列,仅当线程第一次调用GDI函数数系统给线程创建一个消息队列。队列消息送到系统消息队列,然后到线程消息队列;非队列消息直接送给目的窗口过程。
note:只要线程有界面元素或者调用GetMessage,或者有线程消息发送过来,系统就会为线程创建一个消息队列。
2)(外界的设备触发的消息)比如你点击一个按钮
在第一个时刻应该操作系统和鼠标驱动获取这个点击消息,然后找到该焦点的窗口或者地方,送到进程消息队列,然后加入到该线程的消息队列,再者通过pumpmessage translate 和dispatchmessage
程序也有权利直接sendmessage postmessage发队列消息到消息队列中
3)单文档形式的消息循环
WinThread:run()一直循环
4)模态对话框的消息循环
runmodleloop() 这里面没有用到CWinApp的消息循环