学习笔记之深入浅出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函数中。







0 0
原创粉丝点击