AfxBeginThread如何安全退出
2017-02-21 12:54
169 查看
之前的想法是,如果尽量不要在线程中分配内存,这样当线程没有正常退出时,很容易就出现内存泄漏的情况。
所以在这里的test代码也是如此,没有在线程中分配内存,而是在主线程中分配的内存供线程使用。
关于线程正常退出的关键在于:如果在设置了控制线程函数循环的标志位workstatus为false,也需要等待将正在执行的这次循环执行完,才能释放线程中的使用的内存。但是不清楚线程退出了此次的while功能语句的循环需要多长时间,如果时间长了,主线程(可能是用户)不能接受。如果时间短了,在线程还在使用内存时,用TerminateThread()强制退出线程并释放内存,必然造成功能上的缺失,处理数据的不正常,这样的退出方式通常不是我们希望看到的。
解决办法:在主线程的stop中等待需要结束的分线程中while循环已经退出的同步量Event,如果得到这个同步量Event,这说明我们可以释放内存了,此时线程已经正常退出了。 由系统智能的得到将workstatus置为false后的线程正常退出需要的时间,而不是我们的主观臆断。
可能还是从代码中来看,会简单很多:
头文件:
源文件:
在main函数中实践测试过,没有问题。如果有什么问题,希望大家提出。
所以在这里的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函数中实践测试过,没有问题。如果有什么问题,希望大家提出。
相关文章推荐
- VC获取子线程入口函数的退出码(分别由CreateThread,_beginthread,_beginthreadex与AfxbeginThread 创建的子线程 )
- MFC之AfxbeginThread 线程 创建、挂起、释放、结束、退出
- MFC中 如何在类对象内部创建线程(AfxBeginThread())
- 主线程用afxBeginThread()创建多个线程安全退出的办法
- CreateThread()线程创建函数,AfxBeginThread等
- CreateThread()线程创建函数,AfxBeginThread等
- CreateThread 、Afxbeginthread 和 _beginThread 的区别
- AfxBeginThread函数初探
- CreateThread、_beginthreadex和AfxBeginThread的区别
- AfxBeginThread的介绍/基本用法
- AfxBeginThread
- CreateThread、_beginthreadex和AfxBeginThread的区别
- AfxBeginThread和AfxEndThread - 冷秋魂的专栏 - CSDN博客
- FileFuzzer设计时AfxBeginThread问题
- AfxBeginThread和AfxEndThread
- 关于mfc里afxbeginthread的一些感悟
- _beginthreadex、CreateThread、AfxBeginThread的选择
- AfxBeginThread函数
- CreateThread 和AfxBeginThread的编码区别
- AfxBeginThread函数初探