//************工作者線程**************
1.在頭文件中添加UINT ThreadFunc(LPVOID lpParam); 注意應在類的外部
2.添加protected型變量:CWinThread* pThread
3.添加線程處理函數:
UINT ThreadFunc(LPVOID lpParam)
{
while (true)
{
...
Sleep(1000);
}
return 0;
}
4.開啟線程AfxBeginThread(ThreadFunc,lpParam);
注意:用於控制線程循環的標志量在聲明時要加上volatile,
表示每次用到這個變量是都要從內存中讀取
因為Release模式下由於編譯器優化,會把這個變量復制到寄存器,
如果在線程外改變這個變量,寄存器中的不會改變,
在線程中修改這個變量只會改變寄存其中的“副本”
win32
HANDLE WINAPI CreateThread(
_In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,
_In_ SIZE_T dwStackSize,
_In_ LPTHREAD_START_ROUTINE lpStartAddress,
_In_opt_ LPVOID lpParameter,
_In_ DWORD dwCreationFlags,
_Out_opt_ LPDWORD lpThreadId
);
_In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,
_In_ SIZE_T dwStackSize,
_In_ LPTHREAD_START_ROUTINE lpStartAddress,
_In_opt_ LPVOID lpParameter,
_In_ DWORD dwCreationFlags,
_Out_opt_ LPDWORD lpThreadId
);
dwCreationFlags [in]
: 0 創建后立即執行
CREATE_SUSPENDED 線程掛起,直到調用ResumeThread后才開始執行
STACK_SIZE_PARAM_IS_A_RESERVATION 、、、
如:
HANDLE hThread;
DWORD dwThreadId;
: 0 創建后立即執行
CREATE_SUSPENDED 線程掛起,直到調用ResumeThread后才開始執行
STACK_SIZE_PARAM_IS_A_RESERVATION 、、、
如:
HANDLE hThread;
DWORD dwThreadId;
hThread = CreateThread(NULL, 0, ThreadFunc, (LPVOID)0, 0, &dwThreadId);
//如果不用這個句柄,就CloseHandel(ThreadHandle ); 關閉句柄。
//只是關閉了一個線程句柄對象,表示我不再使用該句柄,即不對這個句柄對應的線程做任何干預了。
//如改變優先級,被其他線程等待,強制TermateThread等就要使用這個句柄
//如果不用這個句柄,就CloseHandel(ThreadHandle ); 關閉句柄。
//只是關閉了一個線程句柄對象,表示我不再使用該句柄,即不對這個句柄對應的線程做任何干預了。
//如改變優先級,被其他線程等待,強制TermateThread等就要使用這個句柄
DWORD dwThreadExitCode;
while (true)
{
GetExitCodeThread(hThread, &dwThreadExitCode);//得到線程退出碼
while (true)
{
GetExitCodeThread(hThread, &dwThreadExitCode);//得到線程退出碼
if (iThreadExitCode1 != STILL_ACTIVE)
break;
}
TerminateThread(hThread, 0);
break;
}
TerminateThread(hThread, 0);
//還可以使用_beginthreadex
hThread = (HANDLE)_beginthreadex(NULL, 0, ThreadFun, NULL, 0, &dwThreadId);