问一下 PostQuitMessage后面的MessageBox能执行么

Ians_Huyu 2012-10-08 10:58:21
代码执行到了,但是MessageBox没效果。::MessageBox(NULL,...)也不行。。
...全文
247 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
Ians_Huyu 2012-10-10
  • 打赏
  • 举报
回复
多谢,请见楼上[Quote=引用 15 楼 的回复:]

执行肯定会执行到的,WM_QUIT消息使得消息循环结束,进程即将退出,所以显示不出来,或者就是很快的一闪而过
[/Quote]
Ians_Huyu 2012-10-10
  • 打赏
  • 举报
回复
又如果,没有消息循环就不能MessageBox,那么Petzold第三章讲的一个MessageBox就是WinMain岂不是折了[Quote=引用 16 楼 的回复:]

多谢了~我想还是详细言明:我是用MFC框架,在CWinApp中的InitInstance(你们当然一定很熟悉这个了)的开头大体是CSplash sp;sp.Create()云云,然后while(GetMessage(...))了,于是消息就发送到我自己定义的类了,当然直接点说就是发送到了CSplash的处理函数(我想你们一定知道了),然后当WM_DESTROY的时候,我在PostQuitMess……
[/Quote]
Ians_Huyu 2012-10-10
  • 打赏
  • 举报
回复
多谢了~我想还是详细言明:我是用MFC框架,在CWinApp中的InitInstance(你们当然一定很熟悉这个了)的开头大体是CSplash sp;sp.Create()云云,然后while(GetMessage(...))了,于是消息就发送到我自己定义的类了,当然直接点说就是发送到了CSplash的处理函数(我想你们一定知道了),然后当WM_DESTROY的时候,我在PostQuitMessage后立刻调用了MessageBox,本意是做个小TRACE,可是实际上MessageBox是顶级窗口,是桌面的WS_CHILD,不是CSplash的子窗口。那么问题就是这样的,第一:MessageBox之后程序是不是变成了两个线程的了(关于两个消息循环)?第二:MessageBox的销毁条件难道真的是创建它的进程退出才退出的么(我对此持有很大怀疑)?之后还有很多很多代码,串行到后面就到了MFC自己的消息循环,如果说它闪我也应该看到才是,刚才我又在后面加了很长的一个Sleep,那么它闪我更该看到了。

然后我把Petzold的一个例程打开了,就在WM_DESTROY的PostQuitMessage后面加入了MessageBox,诧异的是MessageBox是执行的但是没有任何效果。为了观察效果,我在后面又加上了Sleep(20000),结果也是执行到了但是没有任何效果。于是现在前两个问题都不重要了,问题是,WM_DESTROY消息处理的时候,是不是进程状态发生了什么变化?(该变化或许是可逆的,因为我试着在第一个消息循环结束后再写一个消息循环,一切照旧)



[Quote=引用 15 楼 的回复:]

执行肯定会执行到的,WM_QUIT消息使得消息循环结束,进程即将退出,所以显示不出来,或者就是很快的一闪而过
[/Quote]
Eleven 2012-10-09
  • 打赏
  • 举报
回复
执行肯定会执行到的,WM_QUIT消息使得消息循环结束,进程即将退出,所以显示不出来,或者就是很快的一闪而过
lslsyqyq 2012-10-09
  • 打赏
  • 举报
回复
亲自试了下 确实执行了 但是不能显示


添加OutputDebugString能输出信息 说明执行了
lslsyqyq 2012-10-09
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

单步没看到~引用 1 楼 的回复:

应该能执行

你单步应该可以看到效果
[/Quote]

在消息循环外面加断点

然后再单步
flytask 2012-10-09
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
引用 2 楼 的回复:

PostQuitMessage

不就关闭了么?通常Post一般都走消息队列的,但是这个是立即返回的。和SendMessage效果一致

MessageBox应该是执行不到的。


sendmessage()不是立即返回的,PostMessage()才是。
如果消息队列只有WM_QUIT消息,那发送后就结束了,线程结束,MessageBox()就执行不……
[/Quote]
++
redeyerabbit 2012-10-09
  • 打赏
  • 举报
回复
TRACE一些消息,分析下,自己跟踪(这时候打断点会干扰消息的处理,毕竟人工比不上机器的速度)。另外你可以在你继续要走的程序前再加一个MessageBox,强制停止下来,应该就可以看到你想要的结果。这些东西自己调试好些,你的思路你自己最清楚,另外你确定你在PostQuitMessage时只是其中一个窗口和它的窗口过程结束了(这个窗口有自己的消息循环?换句话说就是用户UI线程?),别post到主线程中了。
skyandcode 2012-10-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

PostQuitMessage

不就关闭了么?通常Post一般都走消息队列的,但是这个是立即返回的。和SendMessage效果一致

MessageBox应该是执行不到的。
[/Quote]

sendmessage()不是立即返回的,PostMessage()才是。
如果消息队列只有WM_QUIT消息,那发送后就结束了,线程结束,MessageBox()就执行不到了。
如果消息队列有其它消息,就有可能执行到!
redeyerabbit 2012-10-08
  • 打赏
  • 举报
回复
或许能,或许不能。post是异步的.
傻X 2012-10-08
  • 打赏
  • 举报
回复
PostQuitMessage

不就关闭了么?通常Post一般都走消息队列的,但是这个是立即返回的。和SendMessage效果一致

MessageBox应该是执行不到的。
lslsyqyq 2012-10-08
  • 打赏
  • 举报
回复
应该能执行

你单步应该可以看到效果
Ians_Huyu 2012-10-08
  • 打赏
  • 举报
回复
我的是这样,在PostQuitMessage时只是其中一个窗口和它的窗口过程结束了,接下来还要继续走CComndlineInfo和ParseCommandLine,并没有进程结束~[Quote=引用 9 楼 的回复:]

引用 8 楼 的回复:

但紧接着Post的MessageBox竟然被执行了但却没有出现引用 3 楼 的回复:

或许能,或许不能。post是异步的.

被执行没出现是因为进程退出了,强制把资源回收了。
[/Quote]
redeyerabbit 2012-10-08
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

但紧接着Post的MessageBox竟然被执行了但却没有出现引用 3 楼 的回复:

或许能,或许不能。post是异步的.
[/Quote]
被执行没出现是因为进程退出了,强制把资源回收了。
Ians_Huyu 2012-10-08
  • 打赏
  • 举报
回复
但紧接着Post的MessageBox竟然被执行了但却没有出现[Quote=引用 3 楼 的回复:]

或许能,或许不能。post是异步的.
[/Quote]
Ians_Huyu 2012-10-08
  • 打赏
  • 举报
回复
奇怪的是代码执行到了[Quote=引用 2 楼 的回复:]

PostQuitMessage

不就关闭了么?通常Post一般都走消息队列的,但是这个是立即返回的。和SendMessage效果一致

MessageBox应该是执行不到的。
[/Quote]
Ians_Huyu 2012-10-08
  • 打赏
  • 举报
回复
单步没看到~[Quote=引用 1 楼 的回复:]

应该能执行

你单步应该可以看到效果
[/Quote]
wyx100 2012-10-08
  • 打赏
  • 举报
回复
post是异步的.

16,472

社区成员

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

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

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