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

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

                                      

怎样彻底结束一个线程?
最安全的办法是线程的循环体里面检查一个退出事件,此事件一触发就自己清除资源并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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值