1.我做了这样一个试验,MainFrm处理APP SendMessage()过来的消息X,在MainFrm处理X消息函数中向ChildFrm SendMessage()消息A,
childFrm在处理消息A的函数中,先向MainFrm SendMessage(消息B),再PostMessage(消息C),然后返回。结果是:先处理消息B,再处理消息C,最后消息A处理结束返回。 把B、C消息顺序对换,处理结果也相应对换。这样的话,PostMessage()除了返回值的意义不同外(一个是函数返回值 ,一个是BOOL型,表示是否发送成功),跟SendMessage()有什么不同呢?
2,在消息C中使用Sleep(),可以看到整个程序界面都是假死状态,可推断这些消息的处理都在一个线程中。
,另外,是否可这样理解,MainFrm在处理消息X时,在未返回前,仍然能响应其它的消息?如果使用消息队列的话,这是如何实现的?
我只能理解是SendMessage(), PostMessage()只是调用各个窗口的消息函数而已,只不过一个取返回值 ,一个忽略返回值。
postmessage是放入消息队列
postmessage是投递消息,只负责把消息传递给窗口过程,不会等待消息执行完.我也是初学,相互交流..
就是说SendMessage不会将消息放入消息队列??那我把APP也改成PostMessage(X)给MainFrm, 结果还是一样
理论上MainFrm应该在执行完X的响应该函数后,再执行C的响应函数
结果是:先处理消息B,再处理消息C,最后消息A处理结束返回。
=============================
当消息B处理完成之后,发现消息队列中还有个消息C没有处理,处理之。
当消息C处理完成之后,发现消息队列中是空的,发现消息A没处理完,处理之。2.当窗口响应任何消息时,并不能响应其它消息,所以界面会出现假死的情况。
这样改不明显
先向MainFrm SendMessage(消息B),再PostMessage(消息C)
------------------------------------------------
这里,两个都用post,然后换顺序
这个试过了, 结果都是谁先谁执行跟Post,send没关系
汗,新发现, MessageBox()似乎有着神奇的力量,它改变了上面的结果
我是在B、C的处理函数里面用MessageBox来判断它们的执行顺序的,单步调试时,发现在跳入到B的函数里后,竟然不执行MessageBox,下一步直接跳到C的处理函数里=_=!!,这个神奇的问题先不讨论。
我就把MessageBox()都去掉了,加了一个全局变量,在每个执行函数里往这个全局CString里添加字符串,最后得出的结果是:
执行B(SendMessage) -> main return -> 执行C(PostMessage)
这个应该是真实的结果。[color=#FF0000]的确PostMessage应该是放入消息队列,SendMessage应该是不会放入消息队列的了,而是直接执行至返回。