zoukankan      html  css  js  c++  java
  • 我理解的消息循环

    我们编写的消息循环的代码:
    MSG  msg ;
    while (GetMessage(&msg,NULL,0,0))
    {
       TranslateMessage(&msg);//翻译消息产生新的消息
       DispatchMessage(&msg);//分配一个消息到窗口过程
       //实际上DispatchMessage将消息传给操作系统
       //,由OS调用窗口过程函数对消息进行处理
    }
    消息循环过程描述:
    (1)当用户点击键盘或鼠标时,系统发送消息到指定进程的消息队列
    (2)进程消息循环取出本进程的消息进行处理,处理完成后将消息回传给操作系统(OS)
    (3)OS调用窗口处理过程对消息进行处理

    看到这里,会产生一些问题。

    1、既然最终应用程序进程又把消息回传给OS了,那么为什么还要用消息循环(GetMessage())呢?
    原因是OS提供给应用程序对消息进行处理的机会
    (放弃某些消息或产生新的消息TranslateMessage(&msg)等)

    2、OS如何正确调用窗口过程函数?
    每一个窗口在被创建之前都是首先被注册在OS的(包括窗口的样式、窗口处理过程),
    而MSG中要保存了这些信息,所以每次OS都能正确地调用各个窗口的处理过程.

    DispatchMessage(&msg)把消息传给了OS,那么能不能不仅过OS而直接把消息传给窗口处理过程呢?
    答案是肯定的,SendMessage()就实现了这个功能:
    1、进队消息和不进队消息的区别?
    进队消息:是要经过消息循环才能得到的消息,属于非堵塞模式
    不进队消息:不需要经过进队消息而直接发送到窗口处理过程(类似于消息映射机制),属于堵塞模式

    2、SendMessge()和PostMessage()区别?
    SendMessge()为不进队消息,需要等待窗口处理过程执行完,线程才能继续
    PostMessage()为进队消息

    声明:以上言论只代表一家之言,难免有不当之处,请各位高手拍砖

  • 相关阅读:
    Ubuntu16.04 JAVA配置!
    vs快捷键
    2015上半年软件设计师考点,难点5
    2015上半年软件设计师考点,难点4
    2015上半年软件设计师考点,难点3
    2015上半年软件设计师考点,难点2
    软件的知识产权保护
    标准化知识
    嵌入式系统
    2015上半年软件设计师考点,难点
  • 原文地址:https://www.cnblogs.com/kuailewangzi1212/p/622602.html
Copyright © 2011-2022 走看看