关于windows消息机制的猜想
1.
正常情况下一个进程里面只有一个主线程而已。
主线程负责消息的读取和分析分发。
消息是保存在消息队列里面,消息队列是跟线程相关的。每一个线程都有一个消息队列(工作线程默认没有,但是随便给他发送一个消息,或线程内调用getmessage函数,系统会自动给它生产一个消息队列的)。程序执行逻辑就是,线程不断的从队列里面取消息GetMessage,分析处理TranslateMessage,然后派发DispathMessage——就是调用消息对应的窗口处理函数而已。(非绑定窗口的消息,再说)。
任何一个窗口都是跟线程相关的,也就是任何一个HWND句柄,都有所属的线程。故,不管是进程内还是进程外向某窗口发消息,此消息都会进入那个窗口所在线程的消息队列,由线程派发给那个窗口过程执行。
对于MODAL对话框,其消息获取循环是窗口自己的(就是while的那段代码),但其实获取的消息还是线程所属的消息队列数据,只是为了实现modal效果,所以由窗口过程来实现消息获取派发,以过滤阻塞对下层窗口的消息派发,(这个效果也可以由主ui线程来完成,不过,那样会更加复杂,故MFC将modal模式对话框的实现效果,放在了cdialog里面去实现的)。
2.
消息循环和多线程不是一一对应的,消息就是一个栈,每个窗口都有自己的消息栈,操作系统会不停取消息出来处理,如果没有消息则等待消息入栈。这个就是消息循环。
不同窗口的消息处理其实只是处理器如何分配资源给各个窗口而已,毕竟窗口消息不是一直占用着cpu的。你可以理解为cpu处理了a窗口,然后让a窗口等待,再去处理b窗口。只是这种切换很快,你根本感觉不到a有等待过。
3.
除了模态对话框其他窗口都没有消息循环,只有窗口函数,窗口函数处理消息但它没有循环,窗口函数是被DispatchMessage调用的,DispatchMessage是你在消息循环调用了,其实可以这么说窗口函数是消息循环的一部分。
关于windows消息机制的猜想相关推荐
- Windows消息机制学习笔记(三)—— 消息的接收与分发
Windows消息机制学习笔记(三)-- 消息的接收与分发 要点回顾 消息循环 消息队列 消息的接收 GetMessage 实验1:理解GetMessage 第一步:编译并运行程序A 第二步:编译并运 ...
- Windows消息机制学习笔记(二)—— 窗口与线程
Windows消息机制学习笔记(二)-- 窗口与线程 要点回顾 消息从哪里来? 实验一:Spy++捕获消息 实验二:消息捕获 消息到哪里去? 窗口在哪? 实验:分析CreateWindowExW 窗口 ...
- Windows消息机制学习笔记(一)—— 消息队列
Windows消息机制学习笔记(一)-- 消息队列 基本概念 实验一:使用代码画出最简单窗口 第一步:编译并运行以下代码 第二步:查看运行结果 第三步:使用其它窗口对其进行覆盖,观察效果 总结 消息队 ...
- windows消息机制和Linux,Windows消息机制初谈 (转)
Windows消息机制初谈 (转)[@more@]是一个消息的OS,什么是消息呢?我很难说得清楚,也很难下一个定义(谁在嘘我),我下面从不同的几个方面讲解一下,希望大家看了后有一点了解. 1.消息的组 ...
- Windows消息机制-PreTranslateMessage
PreTranslateMessage作用和使用方法 Windows消息机制的流程: A. 操作系统接收应用程序的窗口消息,将消息投递到该应用程序的消息队列中 B. 应用程序在消息循环中调用GetMe ...
- Windows消息机制详解-5
一. 什么是消息 在解释什么是消息之前,我们先讨论一下程序的执行机制问题.大体上说,程序按照执行机制可以分为两类: 第一类是过程驱动.比如我们最早接触编程时写的C程序,又或者单片机程序.这类程序往往预 ...
- windows消息机制详解-3
1. 引言 Windows 在操作系统平台占有绝对统治地位,基于Windows 的编程和开发越来越广泛. Dos 是过程驱动的,而Windows 是事件驱动的[6],这种差别的存在使得很多Dos 程序 ...
- 【转】深入理解Windows消息机制
转自:https://blog.csdn.net/liulianglin/article/details/14449577 今天我们来学一学Windows消息机制,我们知道在传统的C语音程序中,当我们 ...
- SendMessage和PostMessage及Windows消息机制简介
SendMessage: The SendMessage function sends the specified message to a window or windows. It calls t ...
最新文章
- 【青少年编程】【三级】 魔术表演“开花”
- hdu 5059 判断数字表示方式以及范围合法(int型之内)
- (转载)DevExpress ASPxGridView 使用文档一:概述
- Setting up Jupyter with Python 3 on Ubuntu
- 转 性能分析工具汇总
- 【渝粤教育】国家开放大学2018年春季 0529-21T高级英语阅读(1) 参考试题
- python的print
- Assembly.Load,LoadFile,LoadFrom
- EasyUI框架01——基础学习
- java核心技术卷——学习笔记(一)
- 新手入门makefile教程
- 10张思维导图--javascript
- 检测分割算法改进(篇二) Residual Feature Augmentation(RFA模块)及Adaptive Spatial Fusion(ASF模块)
- bzoj4391 [Usaco2015 dec]High Card Low Card题解
- 【HDR学习】苹果EDR技术洞察(二)
- 用vue2写的开发者在线简历导出
- 第一天-2.安装vmware虚拟机kali系统
- 《疯狂JAVA讲义》学习笔记(一)
- 2021年低压电工考试资料及低压电工复审模拟考试
- oracle11g 联机重做日志、归档日志、日志文件组以及日志文件操作
热门文章
- mysql包导入之后idea仍然报错_IDEA连接MySQL报错怎么弄?
- php改变图片宽高,php缩放图片(根据宽高的等比例缩放)实例介绍
- 往邮箱里发python怎么发_Python 超简单的邮件发送方法
- python发邮件给女朋友代码_python发邮件的代码
- html按钮按下效果_您应该在网站中尝试的8种惊人的HTML按钮悬停效果,让您的网站令人难忘...
- java 静态绑定原理_Java方法的静态绑定与动态绑定讲解
- velocity参数重新赋值_Velocity(5)——#set指令
- 半夜三点,去医院看病。。。
- 我的10年富士康故事
- 突发!百度CEO李彦宏被当中泼了一瓶水,肇事者网名:直男上树