博客
关于我
MFC工作笔记0009---VC++中 PostMessage和SendMessage的区别
阅读量:794 次
发布时间:2023-02-09

本文共 1014 字,大约阅读时间需要 3 分钟。

最近在做一个基于VC的UDP通信项目时,对消息机制进行了深入整理。与.NET开发相比,VC的消息处理方式有着显著的不同。在.NET中,消息处理通常采用代理模型,开发者可以通过简单的方法进行操作。而在VC开发中,我们需要手动编写消息响应函数,这增加了开发的复杂度。

在VC的消息处理中,PostMessage和SendMessage是两个关键的函数。PostMessage的特点是将消息放入接收窗口的队列中,并立即返回。这意味着发送消息的线程不会因为消息处理而被阻塞,继续执行后续操作。而SendMessage则不同,它会等待目标窗口处理完消息后再返回。这使得SendMessage适用于需要同步操作的场景。需要注意的是,PostMessage和SendMessage的返回值有着不同的含义。PostMessage的返回值仅表示消息是否成功发送,而SendMessage的返回值则反映了目标窗口处理消息后的结果。

在同一个线程内使用PostMessage发送消息时,消息会被放入线程的消息队列中,然后通过消息循环逐步分发给目标窗口。而SendMessage则直接调用目标窗口的消息处理程序,并等待处理完成后再返回结果。这在单线程应用中可能不需要额外的处理,但在多线程场景下,尤其是跨线程发送消息时,PostThreadMessage是一个更为稳妥的选择。SendMessage在同一线程内发送消息时,会直接进行处理,而不会进入线程消息队列。

关于线程间的消息传递,建议使用PostThreadMessage函数来代替PostMessage。PostThreadMessage专门用于跨线程发送消息,它能够确保消息能够正确地进入目标线程的消息队列,并且发送线程会等待处理完成后再继续执行。SendMessage函数则会将消息发送到目标窗口所属线程的消息队列中,然后发送消息的线程会等待目标窗口处理完毕并返回结果。这种机制在跨线程通信中非常重要,因为它确保了消息的正确传递和处理。

在使用消息发送函数时,还需要注意消息码的范围。如果发送的消息码在WM_USER以下(即非自定义消息),且消息参数中包含指针,那么PostMessage、SendNotifyMessage和SendMessageCallback这些异步消息发送函数将会失败。因此,在发送非自定义消息时,尽量避免使用带有指针参数的消息发送函数,以确保程序的稳定性和兼容性。

转载地址:http://kwffk.baihongyu.com/

你可能感兴趣的文章
MyBatis学习总结(23)——Mybatis打印Sql语句配置
查看>>
MyBatis学习总结(22)——Mybatis自增长ID获取
查看>>
Mybatis-plus 集成 PostgreSQL 数据库自增序列问题记录
查看>>
MyBatis-Plus 还手写 Join 联表查询?一个依赖轻松搞定,真香!
查看>>
mybatis-plus 扩展、插件
查看>>
Mybatis-Plus 开发提速器:mybatis-plus-generator-ui 你确定不了解一下?
查看>>
mybatis-plus 开发利器 ,再也不用写单表CRUD的重复代码了!
查看>>
Mybatis-plus 实现多租户业务实战
查看>>
MyBatis-Plus LambdaQueryWrapper 详解:优雅构建类型安全的查询条件
查看>>
MyBatis-Plus CURD示例及条件构造器示例
查看>>
mybatis-plus apply 防SQL注入,从零基础到精通,收藏这篇就够了!
查看>>
mybatis-generator-maven-plugin:1.3.2:generate failed: Exception getting JDBC Driver: com.mysql.jdbc.
查看>>
Mybatis-@MapperScan和mybatisscan分析
查看>>
mybatis+springboot+MySQL批量插入 1w 条数据
查看>>
MyBatis 注解和Provider注解(动态构建SQL)使用
查看>>
mybatis
查看>>
MyBatis
查看>>
mybaits的批量修改以及其中的坑
查看>>
Mybaits源码分析
查看>>
mybaits+springboot打印sql日志
查看>>