学习笔记之深入浅出MFC 第5章 Windows程序的生与死
在上面幾個章節中我們已經對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程序的生与死的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端学习(2633):父子传值
- 下一篇: 内容管理系统