在上面几个章节中我们已经对win32程序的架构以及它与Windows系统之间的关系已经有了一个整体的介绍,对于窗口创建以及消息传递的原理也有了原理上的理解,但是为了更透彻的了解Windows程序的各个环节,现在我们需要进一步的对Windows消息种类以及发生的时机进行透彻的了解。在程序设计的时候这一点是非常重要的。

现在我们以窗口的诞生和死亡,说明消息的发生与传递,以及应用程序的兴起与结束。在下图中对个步骤做了详细介绍。

这个地方我们需要解释一下:为什么结束一个程序会这么复杂呢?是这样的:Windows程序的运行过程是在消息的推动下进行的,也就是说Windows程序一旦建立并进入到消息循环中之后,除了从操作系统中接收消息之外,没有其他的外界交互。所以程序一直在进行等待消息的循环。而消息只能来自于操作系统的消息序列。来什么消息Windows程序就会做出什么操作,所以想要结束程序,就必须接收到操作系统地消息WM_QUIT。

举个例子,在窗口函数中拦截WM_DESTORY,但不调用PostQuitMessage。这样之后操作系统可以收到WM_CLOSE和WM_DESTORY消息,但是无法接受到WM_QUIT消息了。接收到WM_CLOSE和WM_DESTORY后会把窗口清除,也就是把窗口摧毁及数据结构释放。窗口就从程序中消失了。但是,程序没有接收到WM_QUIT消息呀,别忘了程序还在消息循环中运行着呢。只有这个消息才能结束循环。所以程序并没有结束,仍然留在内存中。

程序的从生到死的过程你以为到这里就结束了吗?我想起一个小故事,老和尚让小和尚拿一个碗,让小和尚把碗装满。小和尚端了一碗石头来了,老和尚问满了吗?小和尚说满了。然后老和尚往里面又加入好多沙子,然后问满了吗?小和尚说满了,然后老和尚又往里倒入了一碗水,然后问满了吗?小和尚说这次真满了。然后老和尚有加入了一勺盐。。。

我为什么会想到这个故事呢?因为这里也是这个道理。消息循环一直在运行处理消息是吧,还有其他时间吗?有。当没有消息到来时循环是在空载运行,这就太浪费系统资源了。要知道计算机的运算速度是非常快的,在消息与消息之间会有很多时间是空闲的,这就叫空闲时间。我们要用一个函数来利用这些计算机资源:OnIdle()函数。

空闲时间的处理:OnIdle

所谓的空闲时间(idle time ),是指“系统中没有任何消息等待处理”的时间。举个例子,没有任何程序使用定时器,使用者也没有碰触键盘和鼠标或任何外围,那么,系统就处于所谓的空闲时间。

空闲时间常常发生,毕竟计算机速度超乎想像。

后台工作最适宜在空闲时间完成。传统的SDK程序如果要处理空闲时间,可以以下列循环取代WinMain中传统的消息循环:

原因是PeekMessage和GetMessage性质不同。它们都是到消息队列中抓消息,如果抓不到,程序的主执行线程会被操作系统挂起。当操作系统再次回来照顾这一执行线程时,发现消息队列中仍然是空的,这时候两个API函数的行为就不同了:

GetMessage会过门不入,于是操作系统再去照顾其他线程;

PeekMessage会取回控制权,使程序得以执行一段时间。于是上述消息循环进入OnIdle函数中。

学习笔记之深入浅出MFC 第5章 Windows程序的生与死相关推荐

  1. 《python基础教程(第二版)》学习笔记 基础部分(第1章)

    <python基础教程(第二版)>学习笔记 基础部分(第1章) python常用的IDE: Windows: IDLE(gui), Eclipse+PyDev; Python(comman ...

  2. 《游戏设计艺术(第2版)》——学习笔记(24)第24章 其他玩家有时会形成社群

    <游戏设计艺术(第2版)>学习笔记(24) 第24章 其他玩家有时会形成社群 不仅仅是其他玩家 强大社群的10条建议 社群建议1:培养友谊 社群建议2:牢记矛盾 社群建议3:运用建筑学去形 ...

  3. 【Python学习笔记—保姆版】第四章—关于Pandas、数据准备、数据处理、数据分析、数据可视化

    第四章 欢迎访问我搞事情的[知乎账号]:Coffee 以及我的[B站漫威剪辑账号]:VideosMan 若我的笔记对你有帮助,请用小小的手指,点一个大大的赞哦. #编译器使用的是sypder,其中&q ...

  4. 《游戏设计艺术(第2版)》——学习笔记(17)第17章 有种体验叫作故事

    <游戏设计艺术(第2版)>学习笔记(17) 第17章 有种体验叫作故事 故事/游戏的二象性 被动娱乐的迷思 梦想 事实 真实世界方法1:珍珠串 真实世界方法2:故事机 问题 问题1:好的故 ...

  5. 《游戏设计艺术(第2版)》——学习笔记(8)第8章 游戏通过迭代提高

    <游戏设计艺术(第2版)>学习笔记(8) 第8章 游戏通过迭代提高 选择创意 八项测试 迭代规则 软件工程的简短历史 危险--瀑布--保留 巴里·伯姆爱你 敏捷宣言 风险评估与原型设计 制 ...

  6. MYSQL学习笔记(自用)第七章

    MYSQL学习笔记(自用)第七章 第一节.创建视图| Creating Views USE sql_invoicing;CREATE VIEW sales_by_client AS SELECT c. ...

  7. 《游戏设计艺术(第2版)》——学习笔记(7)第7章 游戏始于一个创意

    <游戏设计艺术(第2版)>学习笔记(7) 第7章 游戏始于一个创意 灵感 陈述问题 如何睡眠 你的无声伙伴 潜意识建议1:给予关注 潜意识建议2:记录你的创意 潜意识建议3:(明智的)满足 ...

  8. R语言学习笔记——入门篇:第三章-图形初阶

    R语言 R语言学习笔记--入门篇:第三章-图形初阶 文章目录 R语言 一.使用图形 1.1.基础绘图函数:plot( ) 1.2.图形控制函数:dev( ) 补充--直方图函数:hist( ) 补充- ...

  9. 《游戏设计艺术(第2版)》——学习笔记(11)第11章 玩家的动机驱使着玩家的脑

    <游戏设计艺术(第2版)>学习笔记(11) 第11章 玩家的动机驱使着玩家的脑 需求 更多需求 内在动机.外在动机 想做与得做 创新 评断 第11章 玩家的动机驱使着玩家的脑 我们先来面对 ...

  10. 《游戏设计艺术(第2版)》——学习笔记(20)第20章 世界中的角色

    <游戏设计艺术(第2版)>学习笔记(20) 第20章 世界中的角色 游戏角色的本质 小说角色 电影角色 游戏角色 化身 理想型 白板 创造令人信服的游戏角色 角色窍门1:列出角色的功能 角 ...

最新文章

  1. 安装Windows 2012域控(For SQLServer 2014 AlwaysOn)
  2. kafka0.11.0.2安装 笔记
  3. 关于修改session的生存时间以及回收机制
  4. 【DP、线段树优化】琪露诺
  5. 利用Comet4J 及时推送消息
  6. windows下python安装gmpy2_安装Python模块gmpy2中的问题解决
  7. FD.io VPP 20.05 官方文档 总目录:用户文档+开发文档+命令行
  8. CDOJ 1805 矩阵 数学
  9. thinkphp3.2 不同域名配置不同分组设置
  10. SiteSucker Pro 4.0.1 扒站神器
  11. Spring中静态代理与动态代理的实现及区别
  12. 小莫取色精灵 使用教程_MQ
  13. 百度地图Android开发清除上一次驾车导航路线
  14. [转][酷酷的滕]我爱你语录
  15. Android10支持ntfs格式u盘
  16. IGV变异可视化设置要点
  17. python中py是什么意思_python中__init__.py是干什么的
  18. C++ Qt自建网页浏览器
  19. matlab画三维图如何更改颜色,matlab画三维图像的示例代码(附demo)
  20. codec基础知识的学习

热门文章

  1. Weblogic的下载、安装、使用
  2. 华为笔试题库及性格测试
  3. GO程序设计语言 PDF 黑色的书 百度云
  4. ch340驱动文件C语言,STC51单片机自学经验分享 WIN10系统安装CH340驱动程序失败的解决方法...
  5. java 定时任务 quartz 时间表达式Cron总结
  6. 前端运行python代码几种方式_前端和python
  7. openwrt信号弱掉线_QCA9880 openwrt 信号非常差
  8. 操作教程:摄像头通过GB28181协议注册EasyCVR的详细配置
  9. 排序(2)二分排序、快速排序、归并排序
  10. 征途2助手网关服务器,【征途2】官方网站-《征途2》夏日激情来袭,清凉一夏版本送限定套装...