线程终止释放资源的问题。

zfangla 2004-04-13 12:10:58
如果用TerminateThread不会释放资源。但书上说,用TerminateThread后紧接这ExitInstance,CloseHandle就能释放资源。是这样的吗?如果用AfxEndThread终止,具体该怎么用?
...全文
69 点赞 收藏 6
写回复
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
liushuaiboy 2004-04-15
mark
回复
vcforever 2004-04-13
sorry,忘了说一点,在希望线程结束的时候你可以使用SetEvent(hEvent);来把hEvnet设置为激发状态,这样WaitForSingleObject()函数就会返回WAIT_OBJECT_0,这样线程函数就可以正常返回,c++对象的析构函数也可以正常调用了!
回复
vcforever 2004-04-13
当你调用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;
}

希望对你有所帮助!
回复
zfangla 2004-04-13
你5星上将就只是“关注”????
回复
关注
回复
bluebohe 2004-04-13
楼上已经说得清清楚楚了,所以mark收藏
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告
暂无公告