Dragon  
Dragon
日历
<2010年8月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
2930311234
统计
  • 随笔 - 58
  • 文章 - 0
  • 评论 - 55
  • 引用 - 0

导航

常用链接

留言簿(3)

随笔分类(58)

随笔档案(58)

搜索

  •  

最新评论

阅读排行榜

评论排行榜

 

首先,来分析一个假设的场景:
如果PostMessage传递的是一些在栈区的变量,PostMessage后把这些数据传到另一个线程的消息队列里,但
由于是栈区上的变量在PostMessage所在函数返回时由系统回收,那么另一线程就会访问不了这些数据。

解决办法:在传送线程PostMessage消息前对栈区上的数据new一份放到堆区上,堆区的数据是程序员手动创
建和手动回收的,然后把这些数据传送到另一线程,由另一线程去手动释放delete。

问题的产生:由于工作线程处理的繁忙,有一些数据在UI线程退出时还没返回,当UI线程退出后,数据返回
由工作线程PostMessage到UI线程,UI线程已经接收不到消息,故未能手动释放工作线程传过来的堆区内存,
造成内存泄漏。

后来,查到如下网站:
http://stackoverflow.com/questions/3807945/mfc-data-forwarding-to-main-thread-via-postmessage
发现PostMessage是有返回值的,发送失败返回false。

故上面的问题有了解决方法:
UI线程(接收线程)退出后工作线程(发送线程)PostMessage是返回false的,故可以利用这个返回值来决定由哪个线程来释放这段
PostMessage中传递的内存,如果传送失败,则由当前PostMessage的线程负责手动回收,如果发送成功就由
接收线程来负责手动回收。

posted on 2012-08-20 17:12 Dragon 阅读(4700) 评论(8)  编辑 收藏 引用 所属分类: VC
评论:
  • # re: 关于PostMessage在多线程中的内存释放问题  万连文 Posted @ 2012-08-20 18:33
    1.对象采用引用计数
    2.对消息机制进行封装使其更面向对象(参考chromium的消息框架)

    其它的办法不是很体面、系统。  回复  更多评论   

  • # re: 关于PostMessage在多线程中的内存释放问题[未登录]  春秋十二月 Posted @ 2012-08-20 18:38
    此类问题,我略有分析,详见http://www.cppblog.com/qinqing1984/archive/2011/10/21/158841.html
    在文章后面。  回复  更多评论   

  • # re: 关于PostMessage在多线程中的内存释放问题  Richard Wei Posted @ 2012-08-20 21:04
    PostMessage只是把消息放到线程消息队列,线程退出时并不保证队列中的所有消息都已经被处理,所以博主上面的解决方案仍然会有内存泄露。   回复  更多评论   

  • # re: 关于PostMessage在多线程中的内存释放问题  Dragon Posted @ 2012-08-21 11:05
    @Richard Wei
    这不关系到消息有没有处理吧,是关系的内存有没有释放的问题,消息队列的消息没处理没关系啊,只要线程把开避的内存释放掉就好。  回复  更多评论   

  • # re: 关于PostMessage在多线程中的内存释放问题  Dragon Posted @ 2012-08-21 11:15
    @Richard Wei
    再想了一下,如果你的意思是:PostMessage成功了,刚刚好接收线程未能处理这个消息就退出了,然后这个内存交由接收线程释放就会有内存泄露。我再完善一下。  回复  更多评论   

  • # re: 关于PostMessage在多线程中的内存释放问题  Richard Wei Posted @ 2012-08-21 11:19
    @Dragon
    是的,你可以试下连续Post 100条Message,然后结束结束接收线程,所有的消息就都被丢掉了,自然就内存泄露了。  回复  更多评论   

  • # re: 关于PostMessage在多线程中的内存释放问题  aa Posted @ 2012-08-21 19:22
    不要追求完美. 要解决的是持续的内存泄露, 对固定量的可以视而不见, 可处理 也可不处理  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


 
Copyright © Dragon Powered by: 博客园 模板提供:沪江博客