執行緒簡介
現在,考察該函式:MFC提供了兩個重載版的AfxBeginThread,一個用於用戶界面執行緒,另一個用於工作者執行緒,分別有如下的原型和過程:
執行緒種類
用戶界面執行緒
用戶界面執行緒的AfxBeginThread的原型如下:
CWinThread* AFXAPI AfxBeginThread(
CRuntimeClass* pThreadClass,
int nPriority,
UINT nStackSize,
DWORD dwCreateFlags,
LPSECURITY_ATTRIBUTES lpSecurityAttrs)
其中:
參數1是從CWinThread派生的RUNTIME_CLASS類;
參數2指定執行緒優先權,如果為0,則與創建該執行緒的執行緒相同;
參數3指定執行緒的堆疊大小,如果為0,則與創建該執行緒的執行緒相同;
參數4是一個創建標識,如果是CREATE_SUSPENDED,則在懸掛狀態創建執行緒,線上程創建後執行緒掛起,否則執行緒在創建後開始執行緒的執行。
參數5表示執行緒的安全屬性,NT下有用。
工作者執行緒
工作者執行緒的AfxBeginThread的原型如下:
CWinThread* AfxBeginThread(AFX_THREADPROC pfnThreadProc,
LPVOID lParam,
int nPriority = THREAD_PRIORITY_NORMAL,
UINT nStackSize = 0,
DWORD dwCreateFlags = 0,
LPSECURITY_ATTRIBUTESlpSecurityAttrs = NULL
);//用於創建工作者執行緒
返回值: 成功時返回一個指向新執行緒的執行緒對象的指針,否則NULL。
pfnThreadProc : 執行緒的入口函式,聲明一定要如下: UINT MyThreadFunction(LPVOID pParam),不能設定為NULL;
pParam : 傳遞入執行緒的參數,注意它的類型為:LPVOID,所以我們可以傳遞一個結構體入執行緒.
nPriority : 執行緒的優先權,一般設定為 0 .讓它和主執行緒具有共同的優先權.
nStackSize : 指定新創建的執行緒的棧的大小.如果為 0,新創建的執行緒具有和主執行緒一樣的大小的棧
dwCreateFlags : 指定創建執行緒以後,執行緒有怎么樣的標誌.可以指定兩個值:
CREATE_SUSPENDED : 執行緒創建以後,會處於掛起狀態,直到調用:ResumeThread
0 : 創建執行緒後就開始運行.
lpSecurityAttrs : 指向一個 SECURITY_ATTRIBUTES 的結構體,用它來標誌新創建執行緒的安全性.如果為 NULL,
那么新創建的執行緒就具有和主執行緒一樣的安全性.
如果要線上程內結束執行緒,可以線上程內調用 AfxEndThread.
結束執行緒的兩種方式
當你在後台用執行緒來列印一些圖形時.有時在列印一部分後,你希望可以停下來,那么此如何讓執行緒停止呢.
常見用法
AfxBeginThread(ThreadProc,this);
其他相關操作
1、執行緒的掛起
DWORD SuspendThread(HANDLE hThread)
返回值:成功則返回執行緒被掛起的次數;失敗則返回0XFFFFFFFF。
2、執行緒的恢復
DWORD ResumeThread(HANDLE hTread)
返回值:成功則返回執行緒被掛起的次數;失敗則返回0XFFFFFFFF。
3、要結束執行緒的兩種方式
(1)、這是最簡單的方式,也就是讓執行緒函式執行完成,此時執行緒正常結束.它會返回一個值,一般0是成功結束,
當然你可以定義自己的認為合適的值來代表執行緒成功執行.線上程內調用AfxEndThread將會直接結束執行緒,此時執行緒的一切資源都會被回收.注意線上程中使用了CString類,則不能用AfxEndThread來進行結束執行緒,會有記憶體泄漏,只有當程式結束時,會在輸出視窗有提示多少byte泄漏了。因為Cstring的回收有其自己的機制。建議在AfxEndThread之前先進行return。
(2)、如果你想讓另一個執行緒B來結束執行緒A,那么,你就需要在這兩個執行緒中傳遞信息.
不管是工作者執行緒還是界面執行緒,如果你想線上程結束後得到它的結果,那么你可以調用:
::GetExitCodeThread函式