• 再战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的消息循环

  • 相关阅读:
    smart code
    上传图片格式简单校验和回显
    【Spring框架】<mvc:default-servlet-handler/>的作用
    (转) SpringMVC学习笔记-
    MybatisX idea 快速开发插件
    mybatis-generator数据库注释实体类生成以及generatorConfig文件配置
    mysql类型为varchar double类型字符串求和多出多个小数
    <c:set> 标签
    MySQL Navicat Premium 保存sql语句
    springboot项目对接支付宝支付
  • 原文地址:https://www.cnblogs.com/OneDream/p/3747882.html
Copyright © 2020-2023  润新知