mfc 多線程使用

MFC的線程有兩種,一種稱爲Work線程,一種稱爲UI線程。一般情況下Work線程與UI線程的區別主要在於UI線程有消息隊列(並不是有沒有界面,這點要注意,UI線程也是可以沒有界面的)。

一、有關創建線程的三種方法: 
1.C語言函數,調用_beginthread(); 
2.API函數,調用CreateThread();  該函數創建線程將返回一個線程句柄,通過該句柄你可以控制和操作該線程,線程結束後就關閉該句柄
3.MFC函數,調用AfxBeginThread(); 
推薦使用MFC函數AfxBeginThread(線程函數,this);

利用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:work線程的入口函數,聲明一定要如下:UINT MyThreadFunction( LPVOID pParam );

(3)pParam:傳遞入線程的參數,注意它的類型爲:LPVOID,所以我們可以傳遞一個結構體入線程。

(4)nPriority:線程的優先級,一般設置爲 0。讓它和主線程具有共同的優先級。

(5)nStackSize:指定新創建的線程的棧的大小。如果爲 0,新創建的線程具有和主線程一樣的大小的棧。

(6)dwCreateFlags:指定創建線程以後,線程有怎麼樣的標誌。可以指定兩個值:

(7)lpSecurityAttrs:指向一個 SECURITY_ATTRIBUTES 的結構體,用它來標誌新創建線程的安全性。如果爲 NULL,那麼新創建的線程就具有和主線程一樣的安全性

3、線程創建

1)在cpp文件裏類的外部進行聲明:UINT ThreadFunc(LPVOID lpParam);

2)定義一個線程的工作函數

UINT MyThreadFunction( LPVOID pParam )

{

    函數體

}

3)創建線程:Thread* 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、結束線程

三.正確的結束一個Work線程

  因爲Work線程是一個全局函數,或者是一個Static函數,所以它的運行完成也就是它的正常退出了。(什麼?不明白,示例代碼如下)

  1.情況一:

UINT WorkFunc(LPVOID pParam)  
2.	{  
3.	  // 工作   
4.	  ......  
5.	   return 0;  // 就算正常退出了,簡單吧   
6.	}  

2.情況二:

Work線程是個死循環或一時半會兒出不來,這時要主線程要發個消息給Work線程,讓他退出。

1.  UINT WorkFunc(LPVOID pParam)  
2.	{  
3.	  for(;;)  
4.	  {  
5.	   // ...   
6.	  if( WAIT_OBJECT_0 == WaitForSingleObject(m_hThread, INFINITE)} // 收到激發態的消息   
7.	    {  
8.	      return 0;//正常退出   
9.	     }  
10.	  
11.	 }//end for   
12.	    
13.	 return 0;  
14.	}  

 

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