对于windows消息机制的体会和理解小纪
结论: 对话框、消息框等子窗口是用自已默认的消息循环,而不是重入到父窗的消息循环!! 主窗阻塞了,第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消息机制的体会和理解小纪相关推荐
- 【转】深入理解Windows消息机制
转自:https://blog.csdn.net/liulianglin/article/details/14449577 今天我们来学一学Windows消息机制,我们知道在传统的C语音程序中,当我们 ...
- windows消息机制详解-3
1. 引言 Windows 在操作系统平台占有绝对统治地位,基于Windows 的编程和开发越来越广泛. Dos 是过程驱动的,而Windows 是事件驱动的[6],这种差别的存在使得很多Dos 程序 ...
- Windows 消息机制浅析
Windows 消息机制浅析 1. Windows 的历史 中国人喜欢以史为鉴,而事实也确实是,如果你能知道一件事情的来龙去脉,往往可以更容易地理解事物为什么会表现为当前这样的现状.所以, ...
- Windows消息机制学习笔记(三)—— 消息的接收与分发
Windows消息机制学习笔记(三)-- 消息的接收与分发 要点回顾 消息循环 消息队列 消息的接收 GetMessage 实验1:理解GetMessage 第一步:编译并运行程序A 第二步:编译并运 ...
- Windows消息机制学习笔记(一)—— 消息队列
Windows消息机制学习笔记(一)-- 消息队列 基本概念 实验一:使用代码画出最简单窗口 第一步:编译并运行以下代码 第二步:查看运行结果 第三步:使用其它窗口对其进行覆盖,观察效果 总结 消息队 ...
- Windows消息机制详解-5
一. 什么是消息 在解释什么是消息之前,我们先讨论一下程序的执行机制问题.大体上说,程序按照执行机制可以分为两类: 第一类是过程驱动.比如我们最早接触编程时写的C程序,又或者单片机程序.这类程序往往预 ...
- Windows消息机制学习笔记(二)—— 窗口与线程
Windows消息机制学习笔记(二)-- 窗口与线程 要点回顾 消息从哪里来? 实验一:Spy++捕获消息 实验二:消息捕获 消息到哪里去? 窗口在哪? 实验:分析CreateWindowExW 窗口 ...
- windows消息机制和Linux,Windows消息机制初谈 (转)
Windows消息机制初谈 (转)[@more@]是一个消息的OS,什么是消息呢?我很难说得清楚,也很难下一个定义(谁在嘘我),我下面从不同的几个方面讲解一下,希望大家看了后有一点了解. 1.消息的组 ...
- Windows消息机制-PreTranslateMessage
PreTranslateMessage作用和使用方法 Windows消息机制的流程: A. 操作系统接收应用程序的窗口消息,将消息投递到该应用程序的消息队列中 B. 应用程序在消息循环中调用GetMe ...
最新文章
- 13个JavaScript图表图形绘制插件
- 【POJ】2828 Buy Tickets(线段树+特殊的技巧/splay)
- python importerror怎么解决-解决python有时候import不了当前的包问题
- java 获取进程_java获取指定进程的stat
- 关于硕士研究生的几点思考
- 【SpringCloud】Spring cloud Alibaba Sentinel 规则持久化
- 如何给小朋友解释单摆运动_模仿小天才钟美美:小朋友都是天生的演员?
- php mysql交互实例_php基于session实现数据库交互的类实例
- OpenGL基础13:第一个正方体
- opencv MAC搭建 + Xcode配置
- raspberry pi2 智能小车源码及测试视频
- C# abstract ,virtual ,override,new --比较好的文章
- Java上传文件格式判断
- 微信小程序UI框架之【weui】怎样使用
- latex 参考文献没有显示_LaTeX 中的参考文献
- 【实习日报】2019年4月上半月 前端开发实习工作日报汇总
- table添加一行且可编辑 vue_Vue使用AntDesign 表格可添加 可编辑行 可选择
- 爬虫 裁判文书网爬取part2
- php方法重写:Declaration of should be compatible with that
- 矩阵不可约和导出图强联通关系
热门文章
- hdmi接口有什么用_你的电脑为什么没有HDMI接口?
- html5 页面 参数传递,详解html中页面跳转传递参数的问题
- python培训学习方法_python编程学习方法及技术进阶建议
- axure 小程序 网盘_万门大学微信小程序实战开发特训班【完结】网盘高清全套最新系列精品课程...
- linux新建用户代码,Linux_用dsadd添加用户的代码,描述: 此工具命令将一些具体 - phpStudy...
- random_state的值如何选_同样是防晒衣,单价几十和几百块有什么不同?选防晒衣认准这4点...
- c语言中赋予从2开始的偶数,2013年计算机二级C语言上机试题三十二及答案
- asl不成功怎么算_那些减肥成功还不反弹的人是怎么做到的?
- 简易无接触温度测量与身份识别装置【2020年大学生电子设计竞赛F题】
- 《管理转型》——读书随笔