MFC中建立和使用執行緒的方法
有關建立執行緒的問題有三種方法: 1.C語言函式,呼叫_beginthread(); 2.API函式,呼叫CreateThread(); 3.MFC函式,呼叫AfxBeginThread(); 推薦使用MFC函式AfxBeginThread();
利用MFC裡的AfxBeginThread函式能很方便地建立執行緒以及對執行緒進行等待、喚醒等操作。
1、函式原型
CWinThread* AfxBeginThread( AFX_THREADPROC pfnThreadProc , LPVOID pParam , int nPriority = THREAD_PRIORITY_NORMAL , UINT nStackSize = 0 , DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL);
2、引數說明
(1)返回值:一個指向新執行緒的執行緒物件。
(2)pfnThreadProc:執行緒的入口函式,宣告一定要如下:UINT MyThreadFunction( LPVOID pParam );
(3)pParam:傳遞入執行緒的引數,注意它的型別為:LPVOID,所以我們可以傳遞一個結構體入執行緒。
(4)nPriority:執行緒的優先順序,一般設定為 0。讓它和主執行緒具有共同的優先順序。
(5)nStackSize:指定新建立的執行緒的棧的大小。如果為 0,新建立的執行緒具有和主執行緒一樣的大小的棧。
(6)dwCreateFlags:指定建立執行緒以後,執行緒有怎麼樣的標誌。可以指定兩個值:
<1>CREATE_SUSPENDED:執行緒建立以後,會處於掛起狀態,直到呼叫ResumeThread;
<2>0:建立執行緒後就開始執行。
(7)lpSecurityAttrs:指向一個 SECURITY_ATTRIBUTES 的結構體,用它來標誌新建立執行緒的安全性。如果為 NULL,那麼新建立的執行緒就具有和主執行緒一樣的安全性。
3、執行緒建立
一般建立過程如下:
先定義一個工作函式,一般來說你的執行緒就是依照該函式的功能執行任務:
UINT MyThreadFunction( LPVOID pParam )
{
//函式體 return 0;
}
然後可以按以下方式建立執行緒:
CWinThread* MyThread=AfxBeginThread(MyThreadFunction , pParam , THREAD_PRIORITY_NORMAL , 0 , 0 , NULL);
4、執行緒的等待與喚醒
(1)讓執行緒等待(暫時掛起):
MyThread->SuspendThread();
(2)喚醒暫停的執行緒:
MyThread->ResumeThread();
5、檢視執行緒狀態:
DWORD code;
GetExitCodeThread(MyThread->m_hThread , &code);
if(code==STILL_ACTIVE){//執行緒仍在執行}
else {//執行緒停止執行}
6、結束執行緒
TerminateThread(MyThread->m_hThread , 0);