我的程序在用for循环时运行时,想在中途中止运行,但无法点击菜单项,也就无法中止,我该怎么办?

解决方案 »

  1.   

    MSG message; if(::PeekMessage(&message, NULL, 0, 0, PM_REMOVE))
    {
    if (message.message == WM_KEYDOWN)
    {
    if(message.wParam == VK_ESCAPE)
    {
    OnCancel();
    }
    }
    else
    ::TranslateMessage(&message);
    ::DispatchMessage(&message);
    }
    在for循环中加上
      

  2.   


    #define WM_STOPCVT WM_USER+100
    void CDlgMain::OnConvertdata() 
    {
    if(!m_bCvting)
    m_bCvting=TRUE;
    else
    {
    PostMessage(WM_STOPCVT,0,0);
    return;
    } MSG msg;
    char tmp[10];
    for(int i = 0; i< 500; i++)
    {
    PeekMessage(&msg, m_hWnd,  0, 0, PM_REMOVE);
    if(msg.message==WM_STOPCVT)
    goto exit;
    TranslateMessage(&msg); 
    DispatchMessage(&msg);  Sleep(10);
    SetWindowText(_itoa(i,tmp,10));
    }exit:
    MessageBox("func end",NULL,NULL);
    m_bCvting=FALSE;
    }
      

  3.   

    判断你中止的条件
    break 或者return 
    都可以!!
      

  4.   

    在for循环中调用下面的函数
    void DoEvents()
    {
    MSG msg;
    while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }
    return;
    }
      

  5.   

    if (message.message == WM_KEYDOWN)
    {
    if(message.wParam == VK_ESCAPE)
    {
    OnCancel();
    }
    }
    你是想用ESC键来终止程序吗?
    响应KEYDOWN事件不能做到的。
    去掉if (message.message == WM_KEYDOWN)这一句,或者改为其他
    建议使用事件模型,事件响应比较快。
      

  6.   

    后面不是有::TranslateMessage(&message);
      

  7.   

    另外一个办法是将for循环放在线程中
      

  8.   

    OnCancel();你可以改为你自己的要终止for后要做的东东.
      

  9.   

    我试了一下  程序没有响应VK_ESCAPE 消息 why?
      

  10.   

    for(int i=1;i<=20;i++)
    {
    MSG message;
    if (m_bPreprocessA)//需要预处理
    {
    if(AfxMessageBox("请先进行预处理",MB_OK|MB_ICONSTOP)==IDOK);
    {//预处理函数调用
    }
    }  

    if (m_bFirstInterp) 
    {//是否需要划框
    if(!m_bSetTrackWindFlag)
    {

    int flag=AfxMessageBox("请先划出目标框",MB_OK|MB_ICONSTOP);
    if (flag==IDOK)
    {
    m_bSetTrackWindFlag=TRUE;  
    }//+
    }//-  

    }  

    if(m_bCutBackgFlag)
    { //跟踪窗已划出
    AutoInterpret();
    }

    if (!m_bInterpating)
    {//如果判读中止
    break;
    }


    if(::PeekMessage(&message, m_hWnd, 0, 0, PM_REMOVE))
    {
    if (message.message == WM_KEYDOWN)
    {
    if(message.wParam == VK_ESCAPE)
    {
    m_bInterpating=false;
    }
    }
    else
          ::TranslateMessage(&message);
          ::DispatchMessage(&message);
    }

    }
      

  11.   

    简略         初始时 m_bInterpating=true; 
      for(int i=1;i<=20;i++)
    {
    MSG message;
    AutoInterpret();//调用的一段程序  
    if (!m_bInterpating)
    {//如果判读中止
    break;
    }

    if(::PeekMessage(&message, m_hWnd, 0, 0, PM_REMOVE))
    {
    if (message.message == WM_KEYDOWN)
    {
    if(message.wParam == VK_ESCAPE)
    {
    m_bInterpating=false;
    }
    }
    else
    ::TranslateMessage(&message);
    ::DispatchMessage(&message);
    }

    }
      

  12.   

    我试了一下,可以.当按下"Esc"键,可能会延迟一会.
      

  13.   

    另外一个办法是将for循环放在线程中