框架程序的狀態信息
對於應用程序來說,有許多的狀態需要維護:如模塊狀態、線程狀態等。
模塊的概念:每一個被加載到內存中的文件成爲一個模塊。一般進程是由多個模塊組成的,通常應用程序都是通過模塊句柄來訪問進
程中的模塊。事實上,模塊的句柄的值就是該模塊映射到進程中的地址。
模塊 - 線程狀態:AFX_MODULE_THREAD_STATE
模塊狀態: AFX_MODULE_STATE
線程狀態:_AFX_THREAD_STATE
維護模塊的狀態是爲了在程序運行過程中方便查詢,所以每當模塊被加載到內存,執行初始化代碼的時候,就應當爲這個模塊申請一
個 AFX_MODULE_STATE對象,並設置其成員值。爲了保存正在執行的模塊的AFX_MODULE_STATE指針,我們要再定義線程狀態
_AFX_THREAD_STATE,用於保存線程的狀態信息。
同樣,每創建一個線程就創建一個新的 _AFX_THREAD_STATE對象。
框架程序的執行順序
線程經歷的狀態:
1. Initialize Instance : 執行線程實例的初始化工作
2. Running: 進入消息循環
3. Exit Instance: 線程終止時執行清除
Initialize Instance、Run和 Exit Instance函數是由框架程序負責調用的,用戶如果想添加額外的代碼只需重載它們就可以了。
線程剛看時被創建時,必須做一些初始化工作,爲的是產生應用程序的工作平臺----窗口。這項工作是每個線程實例都必須做的,所以
稱之爲Initialize Instance。
程序的初始化過程:
在使用框架程序之前,用戶必須首先創建應用程序實例,這個應用程序實例用來初始化整個類庫框架,也用來維護一些全局變量信息。我們用一個CWinAPP類來描述它。
注意:此框架規定,每個應用程序必須有一個全局的CWinApp對象,這樣CWinApp類的構造函數就會在WinMain函數執行之前被調
用。CWinApp的構造函數除了初始化CWinApp對象之外,還初始化了主線程的線程狀態和當前模塊的模塊狀態。
一個很關鍵的函數:
BOOL AfxWinInit(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow);它負責類庫框架的內部
初始化。
使用類庫框架之後,不需要再與WinMain函數見面了,只需從CWinApp類派生自己的應用程序類,重載InitApplication 或者
InitInstance函數。如果想讓程序進入消息循環,就令InitInstance函數返回TRUE,否則返回FALSE。
InitInstance:負責每個線程只做一次的動作,
InitApplication:負責每個程序只做一次的動作。