Windows程式的生與死
當使用者按下系統菜單中的Close指令項,系統送出WM_CLOSE。通常程式的視窗函數不攔截次消息,于是DefWindowProc函數處理它。DefWindowProc收到WM_CLOSE後,調用DestoryWindow把視窗清除。DestroyWindow本身又會送出WM_DESTROY。程式對WM_DESTROY的标準反應是調用PostQuitMessage。PostQuitMessage沒什麼其它動作,就隻送出WM_QUIT消息,準備讓消息循環退出。
空閑時間的處理:OnIdle
所謂空閑時間(Idle time),是指【系統中沒有任何消息等待處理】的時間。舉個例子,沒有任何程式使用定時器(timer,它會定時送來WM_TIMER),使用者也沒有碰觸鍵盤和滑鼠或任何外圍裝置,那麼,系統就處在所謂的空閑時間。
空閑時間常常發生。不要認為你移動滑鼠時産生了一大堆的WM_MOUSEMOVE,事實上夾雜在每一個WM_MOUSEMOVE之間就可能存在許多空閑時間。畢竟,計算機速度超乎想象。
背景工作最适宜在空閑時間完成。傳統的SDK程式如果要處理空閑時間,可以以下列循環取代WinMain中傳統的消息循環:
1 while(TRUE)
2 {
3 if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
4 {
5 if(msg.message == WM_QUIT)
6 {
7 break;
8 }
9 TranslateMessage(&msg);
10 DispatchMessage(&msg);
11 }
12 else
13 {
14 OnIdle();
15 }
16 }
原因是PeekMessage和GetMessage的不同,GetMessage是阻塞的,而PeekMessage是非阻塞的。
Console程式和DOS程式的差別
console程式是指在Windows下開發的不實用UI的控制台程式
dos程式是指在dos系統下開發的程式
一個程序的誕生與死亡
執行一個程式就必然産生一個程序。最直接的程式執行方式是在shell中即資料總管找那個以滑鼠輕按兩下某個可執行檔案的圖示,執行起來的App程序其實是shell調用CreateProcess激活的。
讓我們看看整個流程:
1、shell調用CreateProcess激活App.exe。
2、系統産生一個【程序核心對象】,計數值為1。
3、系統為此程序建立一個4GB的位址空間。
4、加載器将必要的碼加載到上述位址空間中,包括App.exe的程式、資料,以及所需的動态連結庫。加載器如何知道要加載哪些dll呢?它們被記錄在可執行檔案的.idata section中。
5、系統為此程序建立一個執行線程,稱為主執行線程(primary thread)。執行線程才是CPU時間的配置設定對象。
6、系統調用C runtime函數庫的startup code。
7、startup code調用App程式的WinMain函數。
8、App程式開始運作。
9、使用者關閉App主視窗,使WinMain中的消息循環結束掉,于是WinMain結束。