如何线程终止时释放资源?-

论坛 期权论坛 编程之家     
选择匿名的用户   2021-5-16 18:51   381   0

如何线程终止时释放资源?- -

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

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP