前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PostMessage严谨用法要这样做

PostMessage严谨用法要这样做

作者头像
gaigai
发布2019-08-29 17:38:11
2.5K0
发布2019-08-29 17:38:11
举报
文章被收录于专栏:Windows开发Windows开发

PostMessageAPI是用于给某个窗口异步发送消息,消息的处理可能跟调用线程是同一个,也可能是不同。消息是异步处理,如果消息携带参数是非基本类型,需要new一个对象,消息处理完后再释放该对象,这点大家应该都明白。

PostMessage还有两点要注意,否则容易引发低概率问题,很难排查。

第一, PostMessage调用会失败,比如消息队列限制是2000(系统注册表配置),队列如果已满是无法再次发送消息。

第二, PostMessage调用完的下一行代码与消息处理的代码,它们的执行顺序,由于多线程切换无法预期,所以谁先谁后都有可能。

先看一段不严谨的实现,A线程调用MoveWindow接口给hWnd发送自定义消息WM_MOVE_WINDOW让hWnd所在的B线程调用MoveWindow系统API移动窗口。

这段代码存在两个问题:

第一, PostMessage没有判断失败,如果失败WM_MOVE_WINDOW消息将不会被处理,pRect对象将不会释放,内存泄漏。

第二, PostMessage调用下一行代码打印日志使用pRect对象,此时WM_MOVE_WINDOW消息可能已经处理完,pRect对象已被释放成野指针。

严谨的实现

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-07-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Windows开发 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • PostMessageAPI是用于给某个窗口异步发送消息,消息的处理可能跟调用线程是同一个,也可能是不同。消息是异步处理,如果消息携带参数是非基本类型,需要new一个对象,消息处理完后再释放该对象,这点大家应该都明白。
相关产品与服务
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档