|
|
C++ SDK开发方式下线程使用 |
作者:洛羽叶 点击率:1105 发布时间:2012-11-26 |
采用CreateThread、SuspendThread、ResumeThread、TerminateThread方式,虽然由于C函数涉及安全及资源泄露问题,但不要太在意,除非高强度计算的任务,一般不会出现,并且如果程序运行期间频繁启动线程次数10000次以下根本无需考虑资源泄露,采用SDK线程的方式代码逻辑较为合理。
比较推荐的方式_beginthreadex、SuspendThread、ResumeThread、TerminateThread方式,一般情况下程序逻辑控制合理用不到TerminateThread。
以下是线程使用的注意事项,线程回调函数要使用类成员函数的问题,将this指针当做参数传递。
执行的类静态成员函数
static unsigned __stdcall BogusThreadFunction(void* pParam);
MyThread* This=( MyThread *)pParam;
exitCode=This->ThreadFunction();
实际的函数执行体,此时可以访问成员变量,使用时重载
virtual UINT ThreadFunction();
创建线程
Handle =(HANDLE)::_beginthreadex(NULL, 0,BogusThreadFunction,(void*)this,CREATE_SUSPENDED,&ThreadId);
习惯于采用挂起方式,这样创建、启动、停止、释放逻辑清晰。
启动线程
::ResumeThread(Handle);
利用变量控制等待线程真正启动Sleep+PeekMessage组合。
停止线程
Status= Stopped;
创建一个成员变量Status用以控制线程终止,所有线程的执行部分应当判断Status
强行终止
TerminateThread(Handle,0);
::CloseHandle(Handle);
析构函数释放资源
DWORD code=0;
if(Handle!=NULL)
{
::GetExitCodeThread(Handle,& code);
if(code ==STILL_ACTIVE)
::TerminateThread(Handle,0);
::CloseHandle(Handle);
Handle=NULL;
}
|
|
|
|
|
|