5秒内从向中发送6万条消息,为什么消息会丢呢?

qingfeng_happy5 2008-09-26 07:56:06
我要在5秒内从dll向exe中的工作线程通过调用PostaThreadMessage发送6万条消息,这些消息是一条一条发送出去的。现在可以确定的是,dll确实把6万条消息都发送出去了,但是工作线程只接收到1万条左右,其余的都丢了。我的线程函数如下:
UINT RecvMess(..)
{
MSG msg;
while(1)
{

if(PeekMessage(&msg,PM_REMOVE))
{

switch(msg.message)
{
...
}
}
else
{
...
sleep(100);
}

}
return 0;
}

我的线程函数一直在运行,并没退出,但当接收万1万多条后,调试时程序就再也进入不了if里了,显然,消息队列里已经没有消息了,那些还没接收到的消息都丢了。我的问题是:
1 为什么消息会丢呢?
2 5秒内对方给我发6万条消息过来,我如何才能全部接收到,而不丢失。

提示:我用了GetMessage还是会丢。必须在线程函数里接收消息,不允许对方调用SendMessage(),而我在主线程中接收。
...全文
196 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
WinEggDrop 2008-09-27
  • 打赏
  • 举报
回复
[Quote=引用楼主 qingfeng_happy5 的帖子:]
我要在5秒内从dll向exe中的工作线程通过调用PostaThreadMessage发送6万条消息,这些消息是一条一条发送出去的。现在可以确定的是,dll确实把6万条消息都发送出去了,但是工作线程只接收到1万条左右,其余的都丢了。我的线程函数如下:
UINT RecvMess(..)
{
MSG msg;
while(1)
{

if(PeekMessage(&msg,PM_REMOVE))
{

switch(msg.message)
{
...
}
}

[/Quote]

1.明显地message queue是满了.
2.你有没有检查PostaThreadMessage()的返回值,如果message queue满了,应该会返回某些错误的.如果检查到message queue是满的话,那么肯定要等一下再发了.
qingfeng_happy5 2008-09-27
  • 打赏
  • 举报
回复
怎么自己定义一个队列啊,这个我没做过。
Yofoo 2008-09-27
  • 打赏
  • 举报
回复
消息传递也会耗CPU的, 可以多个消息的内容合并, 发一个消息通知
leechiyang 2008-09-27
  • 打赏
  • 举报
回复
数据库,或者自己定一个队列,把要发送的消息放到里面。
blackcat242 2008-09-27
  • 打赏
  • 举报
回复
检查PostaThreadMessage()的返回值
qingfeng_happy5 2008-09-27
  • 打赏
  • 举报
回复
线程消息队列的大小或者容量可以调整吗?还有就是我想知道,在线程函数中怎么自己定义一个消息队列?
Red_angelX 2008-09-27
  • 打赏
  • 举报
回复
都爆了 肯定丢
yafizyh 2008-09-27
  • 打赏
  • 举报
回复
post消息不保证安全性,超时就丢了。send消息保证安全性,使用不好会造成线程死锁。

高强度消息通讯靠不住,还是用邮槽或管道吧。
Joephia 2008-09-27
  • 打赏
  • 举报
回复

很白的问题,

比如公司里老总会不会让你在5秒内编写50000个程序呢?

显然不会,因为考虑到效率,这是不大实际的问题,

假设你能并行处理10 个程序

那么他会在你完成49990个程序后再把第50000个程序要求告诉你

那么在这之前怎么办呢?

如果有其他程序员,他会让其他程序员处理,

如果没有,他会暂时放文件夹里,等待....

当然他的文件夹可能很小,也可能很大,

但是有一点,如果文件夹满了,那么你被炒鱿鱼的几率会变的很大
tgh621 2008-09-27
  • 打赏
  • 举报
回复
用sendmessage嘛
蒋晟 2008-09-27
  • 打赏
  • 举报
回复
怎么不用数据库
还没淹死的鱼 2008-09-27
  • 打赏
  • 举报
回复
你忘了写程序的法宝:
























































写日志!!!
cnzdgs 2008-09-27
  • 打赏
  • 举报
回复
可以自己定义一个链表,也可以用list等类。
cnzdgs 2008-09-26
  • 打赏
  • 举报
回复
LS各位都说了,消息队列的容量是有限的,不能这样发大量消息。
如果不能用SendMessage,可以考虑以下两种方法:
1、设置线程优先级,让处理消息的线程优先级高于发送消息的线程。
2、自定义一个队列,通过事件来同步。
jameshooo 2008-09-26
  • 打赏
  • 举报
回复
Post消息不要那么快,做一些同步处理,把收发速度平衡一下,否则再大的缓冲区也会不够
jameshooo 2008-09-26
  • 打赏
  • 举报
回复
线程消息队列默认就只能装1万条消息,剩下的当然丢了
zhoujianhei 2008-09-26
  • 打赏
  • 举报
回复
消息队列满。
建议使用内核对象同步。

dirdirdir3 2008-09-26
  • 打赏
  • 举报
回复
短时间那么多,message queue可能满了
僵哥 2008-09-26
  • 打赏
  • 举报
回复
消息队列有一个大小,当未处理的消息超出队列的限制,Post发出的消息会丢失.

15,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧