http://blog.csdn.net/chailyuan/article/details/18001735
有關創建線程的問題有三種方法:
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);