日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

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

發布時間:2023/12/9 windows 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 学习笔记之深入浅出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程序的生与死的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。