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()?
第一次看到这种写法,有点疑惑,还请各位高手指点下!

解决方案 »

  1.   

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

  2.   

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

  3.   

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

  4.   

    我把代码贴出来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吗?
      

  5.   


    (上次OnTimer结束) && (cpu有时间) && (到了设定的时间) 才会进行下次ontimer
      

  6.   

    if (ret <= 0) //如果返回值<=0,连接出错/需要再尝试,需要把此连接 dcc_close()然后再重新用 dcc_init()退出
                    break;
    这个break可以跳出整个循环体,其他的只能跳出switch语句……
      

  7.   

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

  8.   

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

  9.   


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

  10.   

    刚看别人的一段代码,发现自己基础确实还是不扎实。
    又碰到一段这样的
    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){}吧??
      

  11.   

    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){}吧??
    可以退出
      

  12.   

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