请问结束线程时怎样收回线程的资源?
用AfxBeginThread开始线程,用TerminateThread结束线程后,在重新开始线程(AfxBeginThread)时发现内存使用总是有很大的增大,请问怎样收回线程的资源? 问题点数:30、回复次数:12Top
1 楼zxyjyzxyjy(猜)回复于 2005-09-24 11:35:09 得分 3
使线程正常退出,如在线程中检测某一全局的变量来决定退出,并做好清理工作,不要用TerminateThread函数终止线程。Top
2 楼seansoe(www.sysmgmt.com.cn)回复于 2005-09-24 11:42:16 得分 3
在线程函数里调用AfxEndThread()来正常的结束线程,可以释放相关线程资源。TerminateThread()属于强制结束,线程相关资源没有释放。Top
3 楼lianglp(寻找黄金分割点)回复于 2005-09-24 11:42:45 得分 3
ExitThread,或让线程自已退出线程处理过程。
除非不得已用TerminateThread(),希望不要这样,因为用这个函数结束线程,
一些资源不会释放,除非进程结束,比如堆栈等不会释放,所以你的内存就增加了。Top
4 楼yalechenfly(风轻云淡)回复于 2005-09-24 14:41:03 得分 0
谢谢各位,可是我是要在线程外部强制结束线程呀,若用AfxEndThread能不能不放在UINT MyThread(LPVOID pParam)线程函数内部呢?Top
5 楼seansoe(www.sysmgmt.com.cn)回复于 2005-09-24 15:42:14 得分 4
要想线程释放资源必须正常结束,通常是在线程中调用WaitForSingleObject(hEvent...),即去检查一个Event内核对象是否到了Signald状态,如果是则正常退出。外部线程如果想让该线程退出,应该通过SetEvent(hEvent)通知该线程,让其自己退出,而不是在外部TerminateThread().Top
6 楼yalechenfly(风轻云淡)回复于 2005-09-24 17:21:05 得分 0
好的,多谢 seansoe多谢大家,我去实验Top
7 楼yalechenfly(风轻云淡)回复于 2005-09-24 17:21:31 得分 0
同时有好的建议请go onTop
8 楼yalechenfly(风轻云淡)回复于 2005-09-24 18:26:33 得分 0
请问seansoe有没有一个例子呀?Top
9 楼oyljerry(【勇敢的心】→ ㊣提拉米苏√㊣)回复于 2005-09-24 18:45:11 得分 1
要正常退出线程,释放资源等Top
10 楼Delphityro(下岗工人)回复于 2005-09-26 19:44:09 得分 1
正常结束才能释放资源。
主线程通常要等待Top
11 楼Atomictry(天影)回复于 2005-09-27 10:16:03 得分 10
// 流程
1. volatile BOOL bThreadState = FALSE; // 全局
HANDLE m_hTermThreadEvent; // 成员
2. CYourDlg::CYourDlg()
{
m_TreadState = FALSE;
m_hTermThreadEvent = NULL;
}
3. CYourDlg::OK()
{
if (bThreadState) // Thread Start...
return;
AfxBeginThread(ProcessPackThread, this, THREAD_PRIORITY_BELOW_NORMAL);
}
4. UINT ProcessThread(LPVOID lpParam)
{
CYourDlg *pDlg = (CYourDlg *) lpParam;
if (NULL == pDlg)
return 0;
while(TRUE)
{
Sleep(100);
if (!bThreadState)
{
SetEvent(pDlg->m_hTermThreadEvent);
return 0;
}
}
return 1;
}
5. CYourDlg::OnCancel()
{
if (bThreadState)
{
bThreadState = FALSE;
if (NULL != m_hTermThreadEvent)
ResetEvent(m_hTermThreadEvent);
else
m_hTermThreadEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
WaitForSingleObject(m_hTermThreadEvent, INFINITE);
}
CDialog::OnCancel();
}Top
12 楼DentistryDoctor(不在无聊中无奈,就在沉默中变态)回复于 2005-09-27 14:16:59 得分 5
应该给线程一个出口条件。
如果没有出口条件,那么线程内用户分配的资源AfxEndThread也不能正确释放。
AfxEndThread只保证与线程有关的系统资源的释放。Top




