VC消息机制讨论

beyonld 2009-03-01 11:24:28
三个自定义消息与响应函数如下:

#define USE_MESSAGE1 WM_USER+100
#define USE_MESSAGE2 WM_USER+101
#define USE_MESSAGE3 WM_USER+102

ON_MESSAGE(USE_MESSAGE1, OnMessage1)
ON_MESSAGE(USE_MESSAGE2, OnMessage2)
ON_MESSAGE(USE_MESSAGE3, OnMessage3)

LRESULT CFdaDlg::OnMessage1(WPARAM wParam, LPARAM lParam)
{
MessageBox("消息1");
return false;
}
LRESULT CFdaDlg::OnMessage2(WPARAM wParam, LPARAM lParam)
{
MessageBox("消息2");
return false;
}
LRESULT CFdaDlg::OnMessage3(WPARAM wParam, LPARAM lParam)
{
MessageBox("消息3");
return false;
}


一按钮响应函数如下:

void CFdaDlg::OnButton1()
{
PostMessage(USE_MESSAGE1);
PostMessage(USE_MESSAGE3);
PostMessage(USE_MESSAGE2);
}

请问:点击按钮,三个消息到达消息队列的顺序是什么样的?BOX以什么样的顺序弹出?
我测试总是:2,3,1;变换PostMessage的发送顺序,也总是先响应最后发送的消息响应函数,这是为什么?
望高手指教?

...全文
312 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
ahao 2009-03-01
  • 打赏
  • 举报
回复
如果都是PostMessage,处理次序一般就是你的发送次序,但如果结合其他发送方法和消息类型的话,
处理次序就不一定了。

ahao 2009-03-01
  • 打赏
  • 举报
回复
用trace输出调试信息就不会颠倒了,其实弹出次序是对的,但最后一个最终获得消息循环控制。
MessageBox内部有消息循环,但他只会disable父窗口的input消息,所以,post的第二个消息会得到处理,
弹出第二个messagebox,但第一messagebox就无法收到消息,根本没机会显示
第三个同理。

---
http://www.chrometalking.com/
beyonld 2009-03-01
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 cnzdgs 的回复:]
MessageBox中有消息循环,用它来显示会造成这种假象,你可以在三个函数上都设置断点调试来看。
[/Quote]
感谢,正是如此,另外请问:三个消息进入消息队列的顺序一定是1,3,2,还是谁先进队是不可预知的?
cnzdgs 2009-03-01
  • 打赏
  • 举报
回复
MessageBox中有消息循环,用它来显示会造成这种假象,你可以在三个函数上都设置断点调试来看。
arong1234 2009-03-01
  • 打赏
  • 举报
回复
那是你验证方法出问题了,三个消息还是按照你发送顺序被处理,因此最先被处理的消息弹出的窗口在最低下,最后被处理的在最上面,而你看到的只能是最上面的窗口,因此你就误认为这个消息被先处理了
你不要点OK,而把那个窗口朝旁边拖拖看
arong1234 2009-03-01
  • 打赏
  • 举报
回复
那是你验证方法出问题了,三个消息还是按照你发送顺序被处理,因此最先被处理的消息弹出的窗口在最低下,最后被处理的在最上面,而你看到的只能是最上面的窗口,因此你就误认为这个消息被先处理了
你不要点OK,而把那个窗口朝旁边拖拖看
yekoufeng 2009-03-01
  • 打赏
  • 举报
回复
消息也有等级,进入队列后,还会有一个优先级等来处理对应的消息
beyonld 2009-03-01
  • 打赏
  • 举报
回复
多谢各位指教!
prodiving 2009-03-01
  • 打赏
  • 举报
回复
PostMessage投递消息的顺序肯定没错,
OnMessage“X”的触发顺序和你PostMessage的循序肯定是对应的,

如果你不要一次性
PostMessage(USE_MESSAGE1);1
PostMessage(USE_MESSAGE3);3
PostMessage(USE_MESSAGE2);2

而是用个timer拉开点时间间隔,分3次Post,这样3个窗口就都会出现, 且会按照正确顺序出现。1、3、2

但你一次性Post后,MessageBox弹出的内容却和你说的那样,2,3,1,这个跟MessageBox的实现有关吧

但是OnMessage“X”的触发顺序没错, 是1、3、2,然后OnMessage1进入MessageBox后,它还没把自己的窗口show出来的时候就PeekMessage处理了MESSAGE3,于是OnMessage3进入了它的MessageBox,同样,OnMessage3还没显示自己的窗口就触发了MESSAGE2
oyljerry 2009-03-01
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 beyonld 的回复:]
引用 3 楼 cnzdgs 的回复:
MessageBox中有消息循环,用它来显示会造成这种假象,你可以在三个函数上都设置断点调试来看。

感谢,正是如此,另外请问:三个消息进入消息队列的顺序一定是1,3,2,还是谁先进队是不可预知的?
[/Quote]
消息也有等级,进入队列后,还会有一个优先级等来处理对应的消息..

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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