(第四版中文版)[十一]Windows消息處理和多線程

PeekMessage () :類似於 GetMessage () ,放在一個長時間工作的函數中,使控制交出。但即使沒有消息到達,它也會馬上返回,從而使函數繼續執行。如果有一個消息到達,函數被暫停,消息函數被調用,返回後被暫停函數繼續執行。 

空狀態處理:OnIdle () :在消息隊列爲空的時候被調用,但如果沒有持續的消息,函數不會被持續調用。基類的 OnIdle () 會更新工具欄和狀態指示器,並清除各種臨時對象。重載 OnIdle () 可用來更新用戶界面。如果重載了 CWinApp::OnIdle() ,一定要重載基類的 OnIdle(),否則工具欄按鈕不會被更新,臨時對象也不會被清除。如果用戶運行在一個模式對話框裏或者正在使用菜單,則這時 OnIdle() 不會被調用,如果希望在這咱情況下使用後臺處理,則必須加入 WM_ENTERIDLE消息控制函數,但必須加到框架類而不是視圖類,這是因爲彈出式對話框總是屬於應用程序的主框架窗口而不是視圖窗口。

多線程編程:大多數情況下,進程的所有代碼和數據空間被進程內所有的線程所利用。線程由操作系統管理,且每個線程都有自己的堆棧。Windows提供 輔助線程和用戶界面線程 兩種。MFC對兩種線程都支持。用戶界面線程有窗口,因此有自己的消息循環;輔助線程沒有窗口,所以不需要處理消息。輔助線程容易編程通常也很有用。

輔助線程:在啓動一個輔助線程前,必須爲線的主程序寫一個全局函數,該函數返回一個UINT,並且帶一個32位值(聲明爲LPVOID)作爲參數。可以在線程啓動時,用該參數傳送線程任何適當的數據。當全局函數返回時,線程就終止,如果進程被終止,線程也會被終止,但在終止輔助線程前最好確保沒有內存泄漏。爲了啓用輔助線程,程序如下調用 :

CWindThread *pThread =AfxBeginThread(ComputeThreadProc,GetSafeHwnd(),THREAD_PRIORITY_NOMAL );

線程函數:

UINT  ComputeThreadProc ( LPVIOD pParam )

{

       // 處理代碼

      return 0 ;

}

函數 AfxBeginThread 會立即返回,返回值是一個指向新創建的線程對象的指針。可以用這個指針掛起或恢復線程。第二個參數是一個32位值,用來傳給全局函數,第三個爲線程的優先權碼。

主、輔線程通話:不能通過消息,因爲輔助線程沒有消息循環。最簡單的方法是利用全局變量,因爲進程的所有線程都可以訪問全局變量。爲了使變量不會被保存到一個寄存器裏,可以聲明爲 volatile 變量。

輔、主線程通話:通過 Windows消息,因爲主線程總是有消息循環的,而輔助線程有相應窗口的變量。在調用 AfxBeginThread() 時把句柄傳過去。最好用 Post 消息的方法,因爲如果用 Send () ,會引起主線程的MFC消息處理代碼的重入,而這在模式對話框中會出現問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章