如何线程终止时释放资源?- -
怎样彻底结束一个线程?
最安全的办法是线程的循环体里面检查一个退出事件,此事件一触发就自己清除资源并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;
}