开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 170|回复: 5
收起左侧

[已解决] PostThreadMessageA 发送消息丢失,附带完整的程序示例

 关闭 [复制链接]
结帖率:33% (1/3)
发表于 2025-2-27 13:20:37 | 显示全部楼层 |阅读模式   浙江省衢州市
50精币
之前发帖询问 PostThreadMessageA 消息丢失问题,没有上传完整的程序可能大家不是很能理解我在说什么,这次我上传了一个示例程序,能复现我的问题。程序启动之后先点击创建线程,然后点击发送消息,发送消息点击足够快,大于子线程的处理时间,那这个消息发送成功但是无法被子线程接收到

主要代码如下:
  
窗口程序集名保 留  保 留备 注
窗口程序集_启动窗口   
变量名类 型数组备 注
线程ID整数型  
线程句柄整数型  

子程序名返回值类型公开备 注
_按钮_创建线程_被单击  
如果真 (线程句柄 > 0)
信息框 (“线程已启动”, 0, , _启动窗口.取窗口句柄 ())
返回 ()

启动线程 (&线程程序, , 线程句柄)
子程序名返回值类型公开备 注
线程程序  
变量名类 型静态数组备 注
死循环逻辑型 
接收消息整数型 
msg消息结构 
如果真 (线程ID > 0)
返回 ()

调试输出 (“线程已启动,线程ID:”到文本 (线程ID))
线程ID = 线程_取自线程ID ()
死循环 = 真
判断循环首 (死循环)
接收消息 = GetMessage (msg, -1, 0, 0)
调试输出 (“接收消息结果:”到文本 (接收消息))
如果真 (接收消息 = 0)
线程ID = 0
线程句柄 = 0
跳出循环 ()

调试输出 (“=============== 接收到消息 ==============”)
' 调试输出 (“message:” + 到文本 (msg.message))
调试输出 (“hwnd:”到文本 (msg.hwnd))
调试输出 (“message:”到文本 (msg.message))
调试输出 (“wParam:”到文本 (msg.wParam))
调试输出 (“lParam:”到文本 (msg.lParam))
调试输出 (“time:”到文本 (msg.time))
调试输出 (“pt_x:”到文本 (msg.pt_x))
调试输出 (“pt_y:”到文本 (msg.pt_y))
调试输出 (“=============== 接收到消息 END ==============”)
程序_延时 (2000)
判断循环尾 ()
子程序名返回值类型公开备 注
_按钮_发送消息_被单击  
变量名类 型静态数组备 注
消息发送结果整数型 
如果真 (线程ID ≤ 0)
信息框 (“请先启动线程”, 0, , _启动窗口.取窗口句柄 ())
返回 ()

消息发送结果 = PostThreadMessageA (线程ID, 2000, 1, 2)
调试输出 (“消息发送结果:”到文本 (消息发送结果))
子程序名返回值类型公开备 注
_按钮_停止线程_被单击  
如果真 (线程ID ≤ 0)
信息框 (“请先启动线程”, 0, , _启动窗口.取窗口句柄 ())
返回 ()

PostThreadMessageA (线程ID, 18, 1, 2)
子程序名返回值类型公开备 注
__启动窗口_创建完毕  



i支持库列表   支持库注释   
EThread多线程支持库
spec特殊功能支持库


我的疑问主要在于子线程接收消息那一块,也就是 线程程序 这个方法中,如果接收到消息开始进行业务处理,假设这个业务处理耗时 2 秒,那么这 2 秒时间内,发送给线程的消息都无法被接收到,相当于丢失了,想咨询一下论坛的大佬这是为什么?如何解决?


线程消息测试.rar

231.76 KB, 下载次数: 1

需要精易模块执行

1740633089477.png

最佳答案

查看完整内容

还是那句话,建议你做消息池。

回答提醒:如果本帖被关闭无法回复,您有更好的答案帮助楼主解决,请发表至 源码区 可获得加分喔。
友情提醒:本版被采纳的主题可在 申请荣誉值 页面申请荣誉值,获得 1点 荣誉值,荣誉值可兑换荣誉会员、终身vip用户组。
快捷通道:申请荣誉值无答案申请取消悬赏投诉有答案未采纳为最佳
结帖率:100% (2/2)

签到天数: 9 天

发表于 2025-2-27 13:20:38 | 显示全部楼层   四川省成都市
还是那句话,建议你做消息池。 VX截图_20250227152219.png

鼠标消息.e

923.46 KB, 下载次数: 3

回复

使用道具 举报

结帖率:33% (1/3)
 楼主| 发表于 2025-2-27 16:38:27 | 显示全部楼层   浙江省衢州市
frankiy 发表于 2025-2-27 15:21
还是那句话,建议你做消息池。

感谢大佬的回答,不过我还是有一个疑问,PostThreadMessageA 目标线程忙碌的时候,投递的消息是直接被丢弃吗?
回复

使用道具 举报

结帖率:100% (2/2)

签到天数: 9 天

发表于 2025-2-27 17:10:39 | 显示全部楼层   四川省成都市
caojianfei 发表于 2025-2-27 16:38
感谢大佬的回答,不过我还是有一个疑问,PostThreadMessageA 目标线程忙碌的时候,投递的消息是直接被丢 ...

实际上向线程投递消息,系统是自带缓冲池的,一次取一个消息。

你可以参考getmessage 的官方说明文档。
回复

使用道具 举报

结帖率:100% (2/2)

签到天数: 9 天

发表于 2025-2-27 17:12:24 | 显示全部楼层   四川省成都市
caojianfei 发表于 2025-2-27 16:38
感谢大佬的回答,不过我还是有一个疑问,PostThreadMessageA 目标线程忙碌的时候,投递的消息是直接被丢 ...

不过,我最大的建议就是, getMessage 的进程,一定要和事件处理进程分开!  因为getMessage进程在没有消息时,会一直挂起!一直到获取到消息! 这样会造成整个线程的堵塞!
回复

使用道具 举报

结帖率:33% (1/3)
 楼主| 发表于 2025-2-27 20:47:18 | 显示全部楼层   浙江省衢州市
frankiy 发表于 2025-2-27 17:10
实际上向线程投递消息,系统是自带缓冲池的,一次取一个消息。

你可以参考getmessage 的官方说明文档。 ...

我看了官方 PostThreadMessageA   GetMessage 的文档好多遍,也尝试了 PeekMessage, 甚至问了好多遍 DeepSeek,但是得到的结果是消息不会丢失,而且很显然我的消息队列没有满,所以我才奇怪为什么连续发送消息会丢失。不过您提供的方案也可以实现我的需求,只不过消息数组会无限增大,不是特别好处理,要删除消息数组还得上锁,这样又降低了并发效率。如果他原生的消息队列可以支持是最好的

评分

参与人数 1好评 +1 收起 理由
frankiy + 1 消息队列的处理方式很简单,在处理环节中,加一个许可证, 处理完了后,重定义一次数.

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表