MFC工作者线程
//************工作者线程**************
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);