和线程有关

   终止线程

有两种情况可以使线程结束:控制函数结束或者根本就不允许线程完成,而提前终止它。我们可以想象在WORD中进行后台打印,如果打印结束了,那线程就可以结束了。如果用户中止了打印,那后台打印线程也要终止了。本文将主要介绍对这两种情况的实现,并且介绍如何获得线程的结束代码。

对于工作线程,结束它是比较容易的:退出线程函数然后返回一个结束原因的代码就是了。用户可以使用AfxEndThread函数或直接利用return返回。通常0代表成功返回,这不是硬性规定,一切要取决于你了。对于用户界面线程,调用::PostQuitMessage,它所要的唯一的参数就是返回代码,也就是工作线程中的那个码,性质是一样的。0通常代表成功。

提前终止一个线程也不难:在线程函数中调用AfxEndThread就是了,其中要传入的参数就是返回代码。这会停止线程的执行,释放线程栈,及与线程相关的DLL,并从内存中删除线程对象。AfxEndThread必须在线程函数内调用,如果用户希望从一个线程结束另一个线程,则需要在两个线程间建立通信机制。

如果需要获得线程返回代码,只需要调用:: GetExitCodeThread就可以了。这个函数的具体作用就看大家具体去查帮助了。它传入的是线程的句柄,和一个提向返回代码的指针。将来就从那个指针得到返回代码。如果线程仍然处于活动状态,那么::GetExitCodeThread得到的返回代码为STILL_ACTIVE,如果已经退出则得到的是返回代码的地址。获得CWinThread对象的返回代码还需要一点麻烦,通常,当CWinThread线程结束时,线程对象就删除了,因为这个对象不存在了,也就没有办法访问对象的m_hThread变量了,为了避免这种情况,可以有两种方法:

将m_bAutoDelete设置为FALSE,这使得线程结束后CWinThread对象仍然存在,这样用户就可以访问m_hThread了,但是如果用户使用这种方法,用户需要自己析构CWinThread对象。这种方法是推荐的方法。

下一个方法是另外保存线程的句柄。在线程创建后,将m_hThread保存在另一个变量中,以后访问这个变量就是了。但是要小心,在复制句柄以前线程并没有结束,最安全的方法是在AfxBeginThread中传入CREATE_SUSPENDED,保存句柄,然后通过调用ResumeThread,重新开始线程。这两种方法都可以帮助用户得到CWinThread对象的返回代码。


当你调用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; 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值