怪异的MessageBox(...)函数!!!!!!!!!!!!!

sxxny 2003-03-24 10:03:29
先看一下下面的代码:
int i = 0;//Global
case WM_TIMER:
if(5 == i)
exit(0);
i++;
do{
;
}while(1);
break;

这段代码的结果很明显,因为消息循环被阻,所以i不可能回等于5,所以程序永远都不会退出

但是当我把它变成下面的代码(加一句)
int i = 0;//Global
case WM_TIMER:
if(5 == i)
exit(0);
i++;
MessageBox(hWnd,"...","...",0);//添加
do{
;
}while(1);
break;

这时候就会不停的弹出对话框,5个以后程序便退出了.这是怎么回事呢???????
...全文
32 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhoory 2003-03-24
  • 打赏
  • 举报
回复
同意!
hysterical7777 2003-03-24
  • 打赏
  • 举报
回复
哦。楼上的分析好精辟
freelybird 2003-03-24
  • 打赏
  • 举报
回复
其实说白了,就是在你的函数中,你去"递归"的调用了自己的函数.如:

int i = 0;//Global

OnTime(...)
{
case WM_TIMER:
if(5 == i)
exit(0);
i++;

OnTime();

break;
}
freelybird 2003-03-24
  • 打赏
  • 举报
回复
楼主还是蛮细心的,能注意到这么细微的变化.

这种现象表面上看起来"挺奇怪"的,其实分析以下还是易于理解.

分析如下:
1 Windows是通过消息驱动的.所以在你的应用程序的主线程中一般有
while(GetMessage(...) != NULL)
{
...
DispatchMessage(...)
...
}

2 WM_TIME是消息级别最底的一类消息,甚至比WM_PAINT还底. 所以WM_TIME消息是可以重叠覆盖的.

3 任何消息要得的执行,都必须要主线程调用GetMessage(...)之类的处理.

4 那为什么"楼主的WM_TIME的消息处理过程还没有执行完,下一次WM_TIME的消息处理又会得以执行呢?" 关键"模式对话框"惹的祸.
我们知道创建一个模式对话框则调用API函数DialogBoxParam,在MFC中也类似.不管那一种方式,总之一点,那就是"模式对话框"有自己的消息处理过程,在SDK中.即:有这样的处理:
while(GetMessage(...) != NULL)
{
...
DispatchMessage(...)
...
}

同样,当你调用MessageBox(...)时,就另有一个消息汞处理.所以,WM_TIME时间又得以执行,至于
do{
;
}while(1);
break;
有没有执行到,只有你在click messagebox的OK button后,才会执行.但不管你有没有这样做,最终你的程序还是会exit的.

为了更有利于你的理解. 下述代码更能说明问题!
int i = 0;//Global
case WM_TIMER:
if(5 == i)
exit(0);
i++;
while(PeekMessage(...) != NULL)
{
...
DispatchMessage(...)
...
}


do{
;
}while(1);
break;


lblyy76 2003-03-24
  • 打赏
  • 举报
回复
MessageBox函数好象和时间没有关系,它的消息响应有点怪,只有这么点印象了。
verybigbug 2003-03-24
  • 打赏
  • 举报
回复
MessageBox可以让消息循环继续的.
所以,WM_TIMER可以继续响应.只不过是do循环的语句没有继续而已.
BinaryTreeEx 2003-03-24
  • 打赏
  • 举报
回复
看这个样子循环没有被运行,你跟踪一下看看有没有被运行到。
funpig 2003-03-24
  • 打赏
  • 举报
回复
up
sxxny 2003-03-24
  • 打赏
  • 举报
回复
以上整个过程我都没有介入过,:)
HexiSoft 2003-03-24
  • 打赏
  • 举报
回复
因为MessageBox(hWnd,"...","...",0)之后TIMER就停止了。你按确定后,TIMER又开了,所以i不停的累加,最后就退出程序了。我猜的。:)
sxxny 2003-03-24
  • 打赏
  • 举报
回复
谢谢freelybird(阿愚)
你能再把关于消息的级别问题给详细解释一下吗?或者贴上相关的资料也可以啊!
arnold8792 2003-03-24
  • 打赏
  • 举报
回复
freelybird(阿愚)
高手,对windows的研究真的很深,
佩服
fang_jb 2003-03-24
  • 打赏
  • 举报
回复
消息机制比较讨厌的地方就在这,哪都有它
用C#写的一个 学生管理系统 using System; using System.Windows.Forms; namespace 学生信息管理 { /// /// DateVali 的摘要说明。 /// 验证用户输入数据的完整性 /// public class DateVali { AddStuinfo valiform = null; public DateVali() { // // TODO: 在此处添加构造函数逻辑 // } public DateVali(AddStuinfo valiform) { this.valiform = valiform; } //验证方法 public bool validate() { if(this.valiform.Stu_Id.Text == "") { MessageBox.Show("请填写学生的学号!@_@"); return false; } if(this.valiform.Stu_Name.Text == "") { MessageBox.Show("请填写学生的姓名!"); return false; } else { for(int i=0;iMessageBox.Show("学生姓名不能为数字!@_@"); return false; } } } if(this.valiform.Stu_Male.Checked == false && this.valiform.Stu_Female.Checked == false) { MessageBox.Show("请选择性别!@_@"); return false; } if(this.valiform.Stu_Idcard.Text == "") { MessageBox.Show("请填写身份证号码!@_@"); return false; } else { for(int i=0;iMessageBox.Show("身份证号码只能是数字!@_@"); return false; } } } if(this.valiform.Stu_Idcard.Text.Length != 18) { MessageBox.Show("身份证要为18的数字!@_@"); return false; } if(this.valiform.Stu_educational.SelectedItem.Equals("--请选择学历--")) { MessageBox.Show("请选择最高学历!@_@"); return false; } if(this.valiform.Stu_NativePlace.Text == "") { MessageBox.Show("请填写你的籍贯!@_@"); return false; } if(this.valiform.Stu_Address.Text == "") { MessageBox.Show("请填写家庭住址!@_@"); return false; } if(this.valiform.Stu_FixTel.Text == "") { MessageBox.Show("请填写固定电话!@_@"); return false; } else { for(int i=0;i

16,465

社区成员

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

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

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