首页 > 学院 > 开发设计 > 正文

AfxBeginThread如何安全退出

2019-11-08 01:19:29
字体:
来源:转载
供稿:网友
之前的想法是,如果尽量不要在线程中分配内存,这样当线程没有正常退出时,很容易就出现内存泄漏的情况。所以在这里的test代码也是如此,没有在线程中分配内存,而是在主线程中分配的内存供线程使用。        关于线程正常退出的关键在于:如果在设置了控制线程函数循环的标志位workstatus为false,也需要等待将正在执行的这次循环执行完,才能释放线程中的使用的内存。但是不清楚线程退出了此次的while功能语句的循环需要多长时间,如果时间长了,主线程(可能是用户)不能接受。如果时间短了,在线程还在使用内存时,用TerminateThread()强制退出线程并释放内存,必然造成功能上的缺失,处理数据的不正常,这样的退出方式通常不是我们希望看到的。

     解决办法:在主线程的stop中等待需要结束的分线程中while循环已经退出的同步量Event,如果得到这个同步量Event,这说明我们可以释放内存了,此时线程已经正常退出了。 由系统智能的得到将workstatus置为false后的线程正常退出需要的时间,而不是我们的主观臆断。

可能还是从代码中来看,会简单很多:头文件:
#PRagma once#include <afxmt.h>class CCCThread{public:	 CCCThread(void);	 ~CCCThread(void);public:	 //开始	 int Start();	 //结束	 int Stop();private:	 LPBYTE         m_pMem;	 UINT static _sThreadFunc(void *_p);//线程函数	 bool               m_workstatus;//工作状态	 CEvent           m_endEvent;//线程是否已经退出循环	 CWinThread *m_pThread;//线程指针};

源文件:

#include "StdAfx.h"#include "CCThread.h"CCCThread::CCCThread(void){}CCCThread::~CCCThread(void){}int CCCThread::Start(){	 m_pMem=new BYTE[10000];	 m_workstatus=true;	 m_pThread=AfxBeginThread(_sThreadFunc,this,THREAD_PRIORITY_NORMAL);	 TRACE("Start!");	 return 0;}int CCCThread::Stop(){	 m_workstatus=false;	 WaitForSingleObject(m_endEvent,INFINITE);	 TRACE("Been stopped!");	 delete [ ]m_pMem;	 return 0;}UINT CCCThread::_sThreadFunc(void *_p){	 CCCThread *pMain=(CCCThread *)_p;	 while(pMain->m_workstatus)	 {		TRACE("running/n");	 }	 pMain->m_endEvent.SetEvent();	 return 0;}在main函数中实践测试过,没有问题。如果有什么问题,希望大家提出。 
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表