CWinThread檢視原始碼討論檢視歷史
CWinThread |
MFC類。CWinThread類是MFC用來封裝線程的,包括UI線程和工作者線程。因此每個MFC程序至少使用一個CWinThread派生類。被MFC程序員熟知的CWinApp應用類就從這裡派生。
簡介
Windows以線程封裝消息循環,封裝消息循環的線程叫做用戶界面線程,即UI線程。該線程可以創建並撤銷窗口。此外,還有一種線程叫做工作者線程,它是輔助UI線程工作的,它沒有消息循環,不能處理系統事件和窗口消息,也不能關聯主窗口。主線程和輔線程雖然享有共同的虛擬地址空間,但各自占用獨立的CPU時間片,參與系統資源的競爭。所以,可以使用輔線程完成經常性的、耗費機時的數據處理工作(例如網絡通信),減輕UI線程的負擔,確保UI線程及時響應用戶的窗口操作。根據需要,一個應用程序中也可以創建多個UI線程。Windows允許同時運行一個應用程序的多個備份,又稱為運行一個程序的多個實例。InitInstance就是「初始化實例」的意思,可見,它是在實例創建時首先被調用的。應用程序總要重載這個虛函數,進行系統設置,創建運行環境。例如,主窗口一定要在InitInstance()中創建,因為該函數退出後就進入該線程的消息循環。
評價
閱讀PumpMessage代碼可知,消息泵並不處理WM_KICKIDLE消息,收到該消息後,直接返回。其實,WM_KICKIDLE消息被用來刺激空閒處理的執行,它作為一個空消息促使::GetMessage()返回。與InitInstance()相反,該函數是在退出消息循環時執行,一般被框架調用,做最後的清理工作。但如果調用InitInstance()失敗,ExitInstance()也會被調用。可以重載ExitInstance(),為線程做相關的清理工作。不要在除重載的Run()函數外的地方調用它。如果將CWinThread成員變量m_bAutoDelete設為TRUE,CWinThread::ExitInstance()會刪除當前的CWinThread對象。所以,如果在堆棧中構造了UI線程對象,可以利用默認的ExitInstance()自動將它刪除。[1]
參考文獻
- ↑ CWinThread搜狗