windows核心编程有这样一段话:
“函数P o s t M e s s a g e在登记了消息之后立即返回,调用该函数的线程不知道登记的消息是否被指定
窗口的窗口过程所处理。实际上,有可能这个指定的窗口永远不会收到登记的消息。如果建立这个特定窗口的线程在处理完它的消息队列中的所有消息之前就结束了,就会发生这种事。”我在一个进程里,给另外一个进程发消息,用P o s t M e s s a g e函数,我不想用Sendmessage。如何保证所发消息被处理?请高手指点一下,哪怕给个思路也可以。
“函数P o s t M e s s a g e在登记了消息之后立即返回,调用该函数的线程不知道登记的消息是否被指定
窗口的窗口过程所处理。实际上,有可能这个指定的窗口永远不会收到登记的消息。如果建立这个特定窗口的线程在处理完它的消息队列中的所有消息之前就结束了,就会发生这种事。”我在一个进程里,给另外一个进程发消息,用P o s t M e s s a g e函数,我不想用Sendmessage。如何保证所发消息被处理?请高手指点一下,哪怕给个思路也可以。
如果超时重新发消息
psw:跟tcp一样了:)
测试结果和我想象的并不一致。
是 “ 新 ” 消息,也不会得到处理的机会。 PeekMessage, GetMessage, GetQueueStatus, WaitMessage,MsgWaitForMultipleObjects, MsgWaitForMultipleObjectsEx这些函数都可以改变“消息队列”的状态。我想这个才是你的问题的真正原因吧,昨天没答在点上。
对每次发送消息后,启动一套检测机制。对发送的消息进行编号,发送后等待消息处理确认消息,不过在一定的时间内没有等到,责认为消息丢了。重发该消息。消息编号不能改变。
在消息接收端,收到消息处理后发回确认信息。如果收到的消息编号已经处理过了,就直直接返回确认信息。
其实,如果测试一下你会发现,消息被丢掉的可能性几乎为零。用微软的东西,只要遵守他的游戏规则,你不回被“罚款”的。消息机制是windows系统的基础。