线程自动删除要领.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
今天主要写的是另一个问题,创建工作线程时,AfxBeginThread返回的CWinThread的对象指针所指的对象在默认情况下会自动删除。如果你不想让他自己删除,而且自己想查看线程信息的话,只需要在创建之后,用返回的CWinThread对象指针来设置m_bAutoDelete成员变量为FALSE即可。 而我很好奇的是,为什么返回的CWinThread可以自动删除呢? 其实光看别人说的自己知道遍罢,其实《深入浅出MFC》中侯老爷子谆谆教导:“在线程结束时,记得把该对象释放掉(利用delete)。”,就是因为这句话,让我的程序中断好几次,错误居然是销毁已经清理了的内存空间。后来查最新资料才知道,默认是会自动删除的。可能侯老爷子当时版本太低,或者其他原因吧。但是侯老爷子说过:“学一样东西,只知道怎么用,但不明白其中的道理,实在是不高明”。再加上本身我就是遇到问题非得心里有底才行,光听别人说是这样,不明白为什么,总觉得心里用的不踏实。好了,废话就不说了,切入正题。 为什么AfxBeginThread函数动态创建的对象会在线程结束后自动销毁呢?难道是有什么消息映射?任何东西究其根源离不开他本身,先去看看AfxbeginThread的源码: view plaincopy to clipboardprint? CWinThread*?AFXAPI?AfxBeginThread(AFX_THREADPROC?pfnThreadProc,?LPVOID?pParam,?? ????int?nPriority,?UINT?nStackSize,?DWORD?dwCreateFlags,?? ????LPSECURITY_ATTRIBUTES?lpSecurityAttrs)?? {?? #ifndef?_MT?? ????pfnThreadProc;?? ????pParam;?? ????nPriority;?? ????nStackSize;?? ????dwCreateFlags;?? ????lpSecurityAttrs;?? ?? ????return?NULL;?? #else?? ????ASSERT(pfnThreadProc?!=?NULL);?? ?? ????CWinThread*?pThread?=?DEBUG_NEW?CWinThread(pfnThreadProc,?pParam);?? ????ASSERT_VALID(pThread);?? ?? ????if?(!pThread-CreateThread(dwCreateFlags|CREATE_SUSPENDED,?nStackSize,?? ????????lpSecurityAttrs))?? ????{?? ????????pThread-Delete();?? ????????return?NULL;?? ????}?? ????VERIFY(pThread-SetThreadPriority(nPriority));?? ????if?(!(dwCreateFlags??CREATE_SUSPENDED))?? ????????VERIFY(pThread-ResumeThread()?!=?(DWORD)-1);?? ?? ????return?pThread;?? #endif?//!_MT)?? }?? 没有发现什么端倪,一切很合情合理。但是书上说过AfxEndThread()就像,_beginthread和_endthread一样配对。那让我们去看一下AfxEndThread()。下面是源码: view plaincopy to clipboardprint? void?AFXAPI?AfxEndThread(UINT?nExitCode,?BOOL?bDelete)?? {?? #ifndef?_MT?? ????nExitCode;?? ????bDelete;?? #else?? ????//?remove?current?CWinThread?object?from?memory?? ????AFX_MODULE_THREAD_STATE*?pState?=?AfxGetModuleThreadState();?? ????CWinThread*?pThread?=?pState-m_pCurrentWinThread;?? ????if?(pThread?!=?NULL)?? ????{?? ????????ASSERT_VALID(pThread);?? ????????ASSERT(pThread?!=?AfxGetApp());?? ?? ????????//?cleanup?OLE?if?required?? ??????

文档评论(0)

kehan123 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档