啟動線程:
1. Win32 API
HANDLE hThread = CreateThread( 0, 0, MainFunctionHandler, 0, 0, 0);
if(hThread == INVALID_HANDLE_VALUE)
{
return 0;
}
else
{
//刪除線程內(nèi)核對象,不影響線程運行,但不再能通過句柄控制該線程。
//適合有變量控制退出線程的情況
CloseHandle(hThread);
return 1;
}
unsigned long __cdecl MainFunctionHandler( LPVOID pParam ){}
2. MFC
CWinThread* AfxBeginThread(threadfun1,this );
這里threadfun1函數(shù)似乎不能作為類成員,最好作為全局函數(shù)來處理。
而且,AfxBeginThread要求其第一個參數(shù)必須有UINT threadfun1(LPVOID pParam)的簽名格式,否則會報錯。
退出線程:
1. 變量控制
線程一般都在循環(huán)中,當(dāng)滿足一定條件時,return,也會將線程結(jié)束。
while(1)
{
//邏輯處理
......
if(bExit == TRUE)
return;
}
2. MFC: AfxEndThread
這個函數(shù)只能用在線程函數(shù)中,當(dāng)滿足一定條件是,調(diào)用。
舉一個例子:
可以創(chuàng)建一個信號量,用WaitForSingleObject函數(shù)來檢測該信號量的狀態(tài)。
成員變量 m_hThreadEvent;
m_hThreadEvent = CreateEvent( NULL, FALSE, FALSE, NULL );
線程的執(zhí)行函數(shù):
DWORD dwRetVal;
dwRetVal = WaitForSingleObject( m_hThreadEvent, INFINATE );
if ( dwRetVal == WAIT_OBJECT_0)
{
// 退出線程
DWORD dwExitCode;
GetExitCodeThread(hThread1, &dwExitCode );
//這個函數(shù)是獲得線程的退出碼,第一個參數(shù)是線程句柄,用 CreateThread 創(chuàng)建線程時獲得到。
// 第二個參數(shù)是一個 DWORD的指針,用來保存線程的退出碼
AfxEndThread( dwExitCode, TRUE );
}
該線程是在信號量有信號時,退出,否則無限等待。
要結(jié)束線程時,使用SetEvent,將信號量置為有信號。
3. Win32 API:TerminateThread
可以使用線程的句柄強行殺死線程。但是不推薦使用這種方式,當(dāng)可以正常結(jié)束的時候,選擇前兩種方法較好。