複製鏈接
請複製以下鏈接發送給好友

AfxBeginThread

鎖定
AfxBeginThread一個計算機函數功能是創建用户界面線程和工作者線程。 常見用法是AfxBeginThread(ThreadProc,this)。
外文名
AfxBeginThread
創建者
AfxBeginThread
分    為
用户界面線程的AfxBeginThread

AfxBeginThread線程簡介

現在,考察該函數:MFC提供了兩個重載版的AfxBeginThread,一個用於用户界面線程,另一個用於工作者線程,分別有如下的原型和過程:

AfxBeginThread線程種類

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工作者線程

工作者線程的AfxBeginThread的原型如下:
CWinThread* AfxBeginThread(AFX_THREADPROC pfnThreadProc,
LPVOID lParam,
int nPriority = THREAD_PRIORITY_NORMAL,
UINT nStackSize = 0,
DWORD dwCreateFlags = 0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs = 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常見用法

AfxBeginThread(ThreadProc,this);

AfxBeginThread其他相關操作

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函數