结论:
对话框、消息框等子窗口是用自已默认的消息循环,而不是重入到父窗的消息循环!!
主窗阻塞了,第1个子窗负责消息循环,调用线程的消息响应函数(包括主窗、第1个子窗的消息响应函数);
第1个子窗阻塞了,第2个子窗负责消息循环,调用线程的消息响应函数(包括主窗、第1个子窗、第2个字窗的消息响应函数);。。。
子窗是一级一级阻塞下去的,后一个子窗关闭了,才能使前一个子窗的消息响应函数解除阻塞。
如果处在中间的子窗关闭了,它的消息响应函数仍还在阻塞中!只有它后面的子窗都关闭了,它的消息响应函数才会返回。
所以,如果是基于消息来处理事件,比如,网络SOCKET异步编程,消息处理函数中,有用到消息框MessageBox或对话框,则要小心,以免多个事件消息同时发生。因为消息框出现后,当前消息处理函数阻塞了,但消息循环仍在进行,如果有新的消息事件产生,则会运行新的消息处理函数,则有可能会产生不希望的后果。
1.消息队列:
是属于线程的,是windows系统为线程创建并维护的一个队列,用于存放各类消息。 系统自身维护一个系统消息队列,然后还为每个GUI线程线程维护一个线程专门消息队列。2.线程:
每个线程默认是没有消息队列的,线程只有在第一次调用用户接口时(比如创建窗口,或者是操作UI元素时),系统才为其创建消息队列。一个应用程序可以有多个线程,但只能有一个UI线程,默认为主线程,其他子线程是无法操作UI并创建UI元素的。这是windows规定的
3.
sendmessage只是发送消息调用消息响应过程,而消息循环阻塞的话窗口还是不响应响应窗体事件即SendMessage会直接调用该消息的响应函数,即不需要通过消息循环。
每个ui窗体模态显示的话都会创建自己的消息循环,一个线程只有一个活动的消息循环,如果在一个已经有模态ui(A)线程的线程创建了另一个ui(B)窗体并模态显示的话,那么此线程的A消息循环会阻塞,将运行B线程的消息循环。
一个窗体的消息循环里调用本窗体的消息响应过程函数(while循环语句里调用),而sendmessage是直接调用消息响应过程函数。

4.所以在一个线程里有多个模态窗体逐个显示的话,要关闭的话也应该先关闭最后一个显示的窗体,因为一个线程只有一个活动的消息循环,例如最后一个ShowDialog()的窗体的消息循环被激活,其他窗体的消息循环则阻塞,只有关闭掉最后一个窗体其他的窗体才能依次激活自己的消息循环,注意:这里消息循环和消息过程不是一回事,每个UI窗体控件都有自己的消息循环,消息过程则是在消息循环里的一个函数,用来处理各种消息对应的事件及逻辑的。

所以多个窗体在一个线程里模态显示的话有的窗体close不了是因为不是关闭的最后一个模态窗体,逐个往之前的递关才能逐个关闭,否则关闭无效,因为之前的窗体消息循环斗阻塞了,虽然能通过sendmessage强制发送消息给消息循环阻塞的窗体,但是sendmessage的作用实际上只是调用了消息循环里向相应过程函数,而消息循环依然被阻塞,所以像close这种消息就不能被响应。

解决办法:

先关闭最后一个即消息循环没有被阻塞而是运行中的窗体,消息循环(调用者)实际上就是窗体里while语句,循环语句里包含消息响应过程函数(被调用),每个窗体都有一个自己的消息循环(即消息循环函数),及自己的消息响应过程。

多线程创建模态窗体能解决消息阻塞问题,因为一个线程只有一个活动的ui线程,这样就异步了。
												

对于windows消息机制的体会和理解小纪相关推荐

  1. 【转】深入理解Windows消息机制

    转自:https://blog.csdn.net/liulianglin/article/details/14449577 今天我们来学一学Windows消息机制,我们知道在传统的C语音程序中,当我们 ...

  2. windows消息机制详解-3

    1. 引言 Windows 在操作系统平台占有绝对统治地位,基于Windows 的编程和开发越来越广泛. Dos 是过程驱动的,而Windows 是事件驱动的[6],这种差别的存在使得很多Dos 程序 ...

  3. Windows 消息机制浅析

    Windows 消息机制浅析 1.       Windows 的历史 中国人喜欢以史为鉴,而事实也确实是,如果你能知道一件事情的来龙去脉,往往可以更容易地理解事物为什么会表现为当前这样的现状.所以, ...

  4. Windows消息机制学习笔记(三)—— 消息的接收与分发

    Windows消息机制学习笔记(三)-- 消息的接收与分发 要点回顾 消息循环 消息队列 消息的接收 GetMessage 实验1:理解GetMessage 第一步:编译并运行程序A 第二步:编译并运 ...

  5. Windows消息机制学习笔记(一)—— 消息队列

    Windows消息机制学习笔记(一)-- 消息队列 基本概念 实验一:使用代码画出最简单窗口 第一步:编译并运行以下代码 第二步:查看运行结果 第三步:使用其它窗口对其进行覆盖,观察效果 总结 消息队 ...

  6. Windows消息机制详解-5

    一. 什么是消息 在解释什么是消息之前,我们先讨论一下程序的执行机制问题.大体上说,程序按照执行机制可以分为两类: 第一类是过程驱动.比如我们最早接触编程时写的C程序,又或者单片机程序.这类程序往往预 ...

  7. Windows消息机制学习笔记(二)—— 窗口与线程

    Windows消息机制学习笔记(二)-- 窗口与线程 要点回顾 消息从哪里来? 实验一:Spy++捕获消息 实验二:消息捕获 消息到哪里去? 窗口在哪? 实验:分析CreateWindowExW 窗口 ...

  8. windows消息机制和Linux,Windows消息机制初谈 (转)

    Windows消息机制初谈 (转)[@more@]是一个消息的OS,什么是消息呢?我很难说得清楚,也很难下一个定义(谁在嘘我),我下面从不同的几个方面讲解一下,希望大家看了后有一点了解. 1.消息的组 ...

  9. Windows消息机制-PreTranslateMessage

    PreTranslateMessage作用和使用方法 Windows消息机制的流程: A. 操作系统接收应用程序的窗口消息,将消息投递到该应用程序的消息队列中 B. 应用程序在消息循环中调用GetMe ...

最新文章

  1. 13个JavaScript图表图形绘制插件
  2. 【POJ】2828 Buy Tickets(线段树+特殊的技巧/splay)
  3. python importerror怎么解决-解决python有时候import不了当前的包问题
  4. java 获取进程_java获取指定进程的stat
  5. 关于硕士研究生的几点思考
  6. 【SpringCloud】Spring cloud Alibaba Sentinel 规则持久化
  7. 如何给小朋友解释单摆运动_模仿小天才钟美美:小朋友都是天生的演员?
  8. php mysql交互实例_php基于session实现数据库交互的类实例
  9. OpenGL基础13:第一个正方体
  10. opencv MAC搭建 + Xcode配置
  11. raspberry pi2 智能小车源码及测试视频
  12. C# abstract ,virtual ,override,new --比较好的文章
  13. Java上传文件格式判断
  14. 微信小程序UI框架之【weui】怎样使用
  15. latex 参考文献没有显示_LaTeX 中的参考文献
  16. 【实习日报】2019年4月上半月 前端开发实习工作日报汇总
  17. table添加一行且可编辑 vue_Vue使用AntDesign 表格可添加 可编辑行 可选择
  18. 爬虫 裁判文书网爬取part2
  19. php方法重写:Declaration of should be compatible with that
  20. 矩阵不可约和导出图强联通关系

热门文章

  1. hdmi接口有什么用_你的电脑为什么没有HDMI接口?
  2. html5 页面 参数传递,详解html中页面跳转传递参数的问题
  3. python培训学习方法_python编程学习方法及技术进阶建议
  4. axure 小程序 网盘_万门大学微信小程序实战开发特训班【完结】网盘高清全套最新系列精品课程...
  5. linux新建用户代码,Linux_用dsadd添加用户的代码,描述: 此工具命令将一些具体 - phpStudy...
  6. random_state的值如何选_同样是防晒衣,单价几十和几百块有什么不同?选防晒衣认准这4点...
  7. c语言中赋予从2开始的偶数,2013年计算机二级C语言上机试题三十二及答案
  8. asl不成功怎么算_那些减肥成功还不反弹的人是怎么做到的?
  9. 简易无接触温度测量与身份识别装置【2020年大学生电子设计竞赛F题】
  10. 《管理转型》——读书随笔