OnTimer中加入MessageBox后 MessageBox一直不断弹出

时间:2022-08-03 00:25:23

BOOL CAlarmClockDlg::OnInitDialog()
{
……

SetTimer(1,1000,NULL);
        ……
}


void CAlarmClockDlg::OnTimer(UINT nIDEvent) 
{
// TODO: Add your message handler code here and/or call default
    static int respons=1;
    //do something
    if(…… && respons)
    {
        MessageBox("时间到!");
        respon=0;
    }
    CDialog::OnTimer(nIDEvent);
}


为啥我在这里加的respons没有起作用。到时间时,MessageBox竟一直不断弹出。请问我是哪里出毛病了??

9 个解决方案

#1


调整一下:
 if(…… && respons)
{
    respon=0;
    MessageBox("时间到!");
 }

#2


OnTimer中加入MessageBox后 MessageBox一直不断弹出

#3


请问flydreamGG ,为什么将response=o放在MessageBox()后面就不能控制消息框只弹出一次??我是新手,不太理解

#4


因为messagebox可能导致OnTimer()函数退出,没有给respon赋值为0

#5


引用 3 楼 zfq_jxj 的回复:
请问flydreamGG ,为什么将response=o放在MessageBox()后面就不能控制消息框只弹出一次??我是新手,不太理解

 static int respons=1; 
这个局部静态变量一开始是1,但是后来被你修改为0了,并且以后一直都是保持0值

你对程序的存储结构不是很理解,所以导致你以为再次进入OnTimer后response会重新赋值为1

但由于静态变量保存在堆内存中,而你的函数代码保存在栈中

函数部分每次执行的时候都是会被重新赋值的,但堆内存中的数据不会被清掉

#6


呵呵,5楼你误解的我的意思,我是想让这个MessageBox仅仅弹出一次,所以我就在if中判断当response为1时才弹出,然后修改response,以后就不让它弹出了。好像是弹出MessageBox()后,后面的代码没有执行,为啥????????

#7


引用 6 楼 zfq_jxj 的回复:
呵呵,5楼你误解的我的意思,我是想让这个MessageBox仅仅弹出一次,所以我就在if中判断当response为1时才弹出,然后修改response,以后就不让它弹出了。好像是弹出MessageBox()后,后面的代码没有执行,为啥????????

先理解消息循环的机制,你弹出MessageBox之后,MessageBox接管了消息的处理,屏蔽了对父窗口的一些消息,但是WM_TIMER消息是不屏蔽的,所以在MessageBox里面又进入到OnTimer这个函数中来,继续弹出MessageBox,如果你按1楼的把 respon = 0 放在MessageBox之前,就没问题了.

#8


如果只是弹出一次:

KillTimer(nIDEvent);
     
MessageBox("时间到!");    

CDialog::OnTimer(nIDEvent);

#9


以前帖子里已经讨论过了,http://bbs.csdn.net/topics/50386820
"MessageBox后并不会阻塞主消息循环" - 这句是关键。

#1


调整一下:
 if(…… && respons)
{
    respon=0;
    MessageBox("时间到!");
 }

#2


OnTimer中加入MessageBox后 MessageBox一直不断弹出

#3


请问flydreamGG ,为什么将response=o放在MessageBox()后面就不能控制消息框只弹出一次??我是新手,不太理解

#4


因为messagebox可能导致OnTimer()函数退出,没有给respon赋值为0

#5


引用 3 楼 zfq_jxj 的回复:
请问flydreamGG ,为什么将response=o放在MessageBox()后面就不能控制消息框只弹出一次??我是新手,不太理解

 static int respons=1; 
这个局部静态变量一开始是1,但是后来被你修改为0了,并且以后一直都是保持0值

你对程序的存储结构不是很理解,所以导致你以为再次进入OnTimer后response会重新赋值为1

但由于静态变量保存在堆内存中,而你的函数代码保存在栈中

函数部分每次执行的时候都是会被重新赋值的,但堆内存中的数据不会被清掉

#6


呵呵,5楼你误解的我的意思,我是想让这个MessageBox仅仅弹出一次,所以我就在if中判断当response为1时才弹出,然后修改response,以后就不让它弹出了。好像是弹出MessageBox()后,后面的代码没有执行,为啥????????

#7


引用 6 楼 zfq_jxj 的回复:
呵呵,5楼你误解的我的意思,我是想让这个MessageBox仅仅弹出一次,所以我就在if中判断当response为1时才弹出,然后修改response,以后就不让它弹出了。好像是弹出MessageBox()后,后面的代码没有执行,为啥????????

先理解消息循环的机制,你弹出MessageBox之后,MessageBox接管了消息的处理,屏蔽了对父窗口的一些消息,但是WM_TIMER消息是不屏蔽的,所以在MessageBox里面又进入到OnTimer这个函数中来,继续弹出MessageBox,如果你按1楼的把 respon = 0 放在MessageBox之前,就没问题了.

#8


如果只是弹出一次:

KillTimer(nIDEvent);
     
MessageBox("时间到!");    

CDialog::OnTimer(nIDEvent);

#9


以前帖子里已经讨论过了,http://bbs.csdn.net/topics/50386820
"MessageBox后并不会阻塞主消息循环" - 这句是关键。