如何线程终止时释放资源?- -
怎样彻底结束一个线程? 最安全的办法是线程的循环体里面检查一个退出事件,此事件一触发就自己清除资源并return。 要通知此线程退出的模块就PostThreadMessage函数,将退出事件post给该线程。 hEventFinish = CreateEvent(NULL,TRUE,FALSE,NULL);//创建手工重置的Event对象 DWORD WINAPI DisplayData(LPVOID param) { while(TRUE) { if( WaitForSingleObject(pDlg->hEventFinish,0) == WAIT_OBJECT_0) return 0; //让线程函数正常返回 //...DisplayData } return 0; } 或者采用全局变量: bool bExit; void CTestView::OnButton7() //执行 { DWORD dwThreadID; bExit = false; FThread=CreateThread(NULL,0,DisplayData, (LPVOID )&x,CREATE_SUSPENDED,&dwThreadID); ResumeThread(FThread); } DWORD WINAPI DisplayData(LPVOID param) { while(TRUE) { //...DisplayData if(bExit) ExitThread(0); } return 0; } void CTestView::OnButtonStop() //退出 { bExit = true; }
--------------------------------------------------------------- 当你调用ExitInstance()函数的时候,你的应用程序也就结束了,当应用程序结束以后操作系统会负责回收进程中所有的资源! 在线程函数中直接使用AfxEndThread()函数就可以使线程退出! 例如你的线程函数如下: UINT ThreadFunc(LPVOID lparam) { AfxEndThread(0);//就可以使当前线程强行退出 } 不过一般情况下也不提倡使用AfxEndThread这个函数来结束线程,他令操作系统强行清除该线程所使用的资源而且会造成c++对象不能正确的调用其析构函数! 例如: #include <windows.h> #include <stdio.h> class obj { public: obj(){printf("constructor")}; ~obj(){prinf("destructor")}; }; obj g_obj; int main() { obj localobj; ExitThread(0);//在这里使用ExitThread,他和AfxExitThread等效 } 看一下运行结果就会很清楚了,结果表明对象的析构函数没有被调用 建议使用一种比较好的方式来结束线程的执行 使用Event对象 HANDLE hEvent; hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);//创建手工重置的Event对象 UINT ThreadFunc(LPVOID lparam) { ....... if( WaitForSingleObject(hEvent,0) == WAIT_OBJECT_0) return 0;//让线程函数正常返回就没有问题了 return 0; } |