学习笔记之深入浅出MFC 第5章 Windows程序的生与死
来源:互联网 发布:mac网页视频怎么全屏 编辑:程序博客网 时间:2024/05/17 05:21
在上面几个章节中我们已经对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程序的生与死
- 深入浅出MFC:Windows程序的生与死
- MFC学习笔记--Window程序的生与死
- 深入浅出MFC学习笔记(第6章 :MFC程序的生死因果)
- 深入浅出MFC学习笔记(第7章:简单而完整的MFC骨干程序)
- 深入浅出MFC学习笔记(第6章 :MFC程序的生死因果)
- 深入浅出MFC学习笔记(第7章:简单而完整的MFC骨干程序)
- 深入浅出MFC学习笔记(第6章 :MFC程序的生死因果)
- 学习笔记之深入浅出MFC 第6章 Console程序介绍
- 学习笔记之深入浅出MFC 第2讲 窗口类注册与窗口的诞生
- 关于Windows MFC程序生与死流程的总结
- 学习笔记之深入浅出MFC 第7章 进程与线程(Process and Thread)
- 学习笔记之深入浅出MFC 第4章 对话框的运行
- 深入浅出MFC学习笔记:MFC六大关键技术仿真之MFC程序的初始化过程
- 学习笔记之深入浅出MFC 第9章 仿真MFC之二
- 学习笔记之深入浅出MFC 第9章 仿真MFC 之一
- 学习笔记之深入浅出MFC 第8章 C++重要性质----基类与派生类:谈继承(Inheritance)
- 学习笔记之深入浅出MFC 第8章 C++重要性质----虚拟函数与多态(Polymorphism)
- Spring MVC And Java Web Learning Diary
- 安装Windows 2012域控(For SQLServer 2014 AlwaysOn)
- maven build 报错
- 魅族便签,能否成为国内便签应用的No.1?
- 不支持默认int
- 学习笔记之深入浅出MFC 第5章 Windows程序的生与死
- 最长公共子串 | 阿里2015笔试附加题2
- Linux ping
- terminate called after throwing an instance of 'std::bad_alloc
- The C programing language chapter 6 : struct
- 欢迎使用CSDN-markdown编辑器
- 清除浮动的七种方式方法(实例代码讲解)
- BZOJ2904: 平方和
- 网页点击按钮返回顶部代码