用戶界面線程AfxBeginThread的使用


用戶界面線程在運行時會有一個窗口界面和與其相對應的窗口函數,所以它可以通過響應消息來和用戶進行交互。

AfxBeginThread 函數原型如下:

CWinThread *AfxBeginThread( 
    CRuntimeClass *pThreadClass,          //從CWinThread派生的RUNTIME_CLASS類   
     int   nPriority  /* = THREAD_PRIORITY_NORMAL */  ,       //指定線程的優先級   
    UINT nStackSize  /* = 0 */  ,                 //定義新線程的堆棧大小   
    DWORD dwCreateFlags  /* = 0 */  ,      //為控制線程創建的附加標志   
    LPSECURITY_ATTRIBUTES lpSecurityAttrs  /* = NULL */       //指定線程的安全屬性   
)  

用戶界面線程必須包含有消息循環,以便可以處理用戶消息。要使用用戶界面線程,必須派生自CWinThread 類一個線程類,而且一般要重寫類的InitInstance ()和ExitInstance ()函數。

示例:編寫一個應用程序,當用戶在程序主窗口按下鼠標左鍵時,會啟動一個用戶界面線程。當用戶在線程窗口界面按下鼠標左鍵時,會彈出一個信息框。
1.新建單文檔程序;
2.單擊菜單欄“項目”→“添加類”→“MFC類”,基類選擇“CWinThread ",類名輸入CMyThread,點”完成“,同時以類似步驟以CFrameWnd類為基類派生CMyWnd 類;
3.在視圖類實現文件包含頭文件:

#include    "MyThread.h"  

4.在CMyThread類實現文件中包含頭文件:

#include    "MyWnd.h"  

5.在CMyThread::InitInstance()中創建線程中的窗體:

BOOL CMyThread::InitInstance() 

    CMyWnd *pFrameWnd =  new   CMyWnd(); 
    pFrameWnd->Create(NULL, _T( "Thread Windows"  )); 
    pFrameWnd->ShowWindow(SW_SHOW); 
    pFrameWnd->UpdateWindow(); 
     return   TRUE; 
}  

6.在CMyWnd類中修改構造函數CMyWnd() public 屬性,然后實現鼠標左鍵消息響應函數:

void   CMyWnd::OnLButtonDown(UINT nFlags, CPoint point) 

    LPTSTR pMessage = _T( "This is a window thread"  ); 
    CWnd *pMainWnd = AfxGetMainWnd(); 
    ::MessageBox(NULL, pMessage, _T( "Thread Message"  , MB_OK));  
    CFrameWnd::OnLButtonDown(nFlags, point); 
}  

7.在應用程序視圖類中實現鼠標左鍵響應函數:

void   CThreadTestView::OnLButtonDown(UINT nFlags, CPoint point) 

    AfxBeginThread(RUNTIME_CLASS(CMyThread)); 
    CView::OnLButtonDown(nFlags, point); 
}  

程序運行結果:

這里要注意的是,這個用戶界面不是屬於主框架窗口的,可以說是和主線程窗口並列的。通過查看桌面任務欄就可以發現,兩個窗口並行着顯示,而且互相不影響。注意上面給出的代碼MessageBox 是引用API的,並且是無窗口,所以這里有三個並行的窗口,而且各不干擾。單獨關閉用戶界面線程的窗體,可以正常退出用戶界面線程。但是如果直接關閉了主線程窗體,那么用戶界面線程就會非法關閉,造成內存泄露。

對於用戶界面線程的正常退出,只要在用戶界面線程內調用PostQuitMessage 即可,參數為0的話,代表成功完成。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM