+ -
当前位置:首页 → 问答吧 → 在线等啊!关于定时器OnTimer内部上加do..while(1);的执行问题

在线等啊!关于定时器OnTimer内部上加do..while(1);的执行问题

时间:2011-11-24

来源:互联网

void CDc_clientDlg::OnTimer(UINT nIDEvent) 
{
// TODO: Add your message handler code here and/or call default
if (nIDEvent == PERIOD_TIMER_ID) //如果是定时器1
{
//执行操作
  。。。。//省略
do {

//......执行部分省略

} while (1); //在这死循环了?
}

CDialog::OnTimer(nIDEvent);
}

代码如上,我想问题下,MFC里启动定时器后,进入OnTimer时,这个do..while(1);是一直在执行不退出了吗?
还是下次定时时间到,再重新进入Ontimer重新执行一次OnTimer()?
第一次看到这种写法,有点疑惑,还请各位高手指点下!

作者: landyxin   发布时间: 2011-11-24

这样做界面应该就卡死无响应了吧

作者: mayudong1   发布时间: 2011-11-24

while如果没有退出条件,那么就一直执行退不出来了。会阻塞下一次OnTimer

作者: oyljerry   发布时间: 2011-11-24

都死循环了,还有机会进Ontimer吗?即使是另一个线程设置timer,你现在的线程也不可能去执行他啊,一直死循环

作者: weixiaoshashou   发布时间: 2011-11-24

定时器是回调,回调如果是单独线程,那这个线程就在做死循环了,不会有下次的ontime
执行语句中应该有情况Break跳出的吧。

作者: chenjiawei007   发布时间: 2011-11-24

引用 4 楼 chenjiawei007 的回复:

定时器是回调,回调如果是单独线程,那这个线程就在做死循环了,不会有下次的ontime
执行语句中应该有情况Break跳出的吧。

我把代码贴出来
C/C++ code

int ret;
        struct dc_msg msg;

        //执行操作
        do 
        {
            ret = dcc_msg_receive(m_DccHdl, &msg); //接收数据,存入msg结构体

            if (ret <= 0) //如果返回值<=0,连接出错/需要再尝试,需要把此连接 dcc_close()然后再重新用 dcc_init()退出
                break;

            switch (msg.msg_type)
            {
            case DC_MSG_DATA:
                PrintModData(&msg, PRINT_MODE_RECEIVE);
                break;

            case DC_MSG_ONLINE:
            case DC_MSG_OFFLINE:
                PrintOnOffMsg(&msg); //打印在线状态
                break;

            case DC_MSG_SENDRESULT:
                PrintSendResultMsg(&msg);//打印发送状态
                break;

            case DC_MSG_STATUSRESULT:
                PrintStatusResultMsg(&msg);//打印状态结果,包含"不存在,上线,下线"
                break;

            case DC_MSG_AT_CMD:
                if (m_pSendATCmdDlg != NULL) 
                    m_pSendATCmdDlg->PostMessage(DC_WM_CMP_AT_RESULT, NULL, (UINT)msg.msg_body);    //PoseMessage给“远程固件更新”对话框
                break;
                
            default:    /* Not defined! */
                break;
            }

        } while (1); //在这死循环了?



里边的break只是跳出switch吧?也能跳出while吗?

作者: landyxin   发布时间: 2011-11-24


(上次OnTimer结束) && (cpu有时间) && (到了设定的时间) 

才会进行下次ontimer

作者: Delphigis   发布时间: 2011-11-24

if (ret <= 0) //如果返回值<=0,连接出错/需要再尝试,需要把此连接 dcc_close()然后再重新用 dcc_init()退出
  break;


这个break可以跳出整个循环体,其他的只能跳出switch语句……

作者: hedengxiang2011   发布时间: 2011-11-24

引用 6 楼 delphigis 的回复:
(上次OnTimer结束) &amp;&amp; (cpu有时间) &amp;&amp; (到了设定的时间)

才会进行下次ontimer

也就是说上次OnTimer()没有结束的话是不会响应其他消息,也不会再进入下一次OnTimer,是这样吗?
您帮我看一下我的代码

作者: landyxin   发布时间: 2011-11-24

只要出不了while循环,你就没有做其它的操作

作者: VisualEleven   发布时间: 2011-11-24

引用 9 楼 visualeleven 的回复:

只要出不了while循环,你就没有做其它的操作


  if (ret <= 0) 
  break;
唯一能出的应该就是这个语句了。

作者: landyxin   发布时间: 2011-11-24

刚看别人的一段代码,发现自己基础确实还是不扎实。
又碰到一段这样的
while (1)
{
if (dcc_msg_send(m_DccHdl, &msg) > 0) //发送成功
{
//PrintModData(&msg, PRINT_MODE_SEND);
ret = TRUE;
break;
}
else
{
if (IDCANCEL == AfxMessageBox(IDS_SEND_FAILED, MB_RETRYCANCEL|MB_ICONINFORMATION|MB_DEFBUTTON2))
ret = FALSE;
break;
}
}
上面的break应该能退出while(1){}吧??

作者: landyxin   发布时间: 2011-11-24

while (1)
 {
 if (dcc_msg_send(m_DccHdl, &msg) > 0) //发送成功
{
 //PrintModData(&msg, PRINT_MODE_SEND);
 ret = TRUE;
 break;
 }
 else
 {
 if (IDCANCEL == AfxMessageBox(IDS_SEND_FAILED, MB_RETRYCANCEL|MB_ICONINFORMATION|MB_DEFBUTTON2))
 ret = FALSE;
 break;
 }
 }
上面的break应该能退出while(1){}吧??


可以退出

作者: syxiyou   发布时间: 2011-11-24

5楼那个程序switch里面的break肯定只能跳出switch循环,至于退出循环我觉得是肯定是ret<=0时也就是接受数据包有错误或为空时退出的

作者: syxiyou   发布时间: 2011-11-24