对话框程序,点确定按钮,执行死循环,想点取消而结束,但因无法接收消息,所以不能结束,如何处理这一问题?

解决方案 »

  1.   

    呵呵 其实很简单 你可以用一个线程专门的进行你所说的死循环 然后在对话框程序点击取消的时候KILL这个线程就可以了 不是很简单吗?????
      

  2.   

    不应该也不能用GetMessage()
    应该用PeekMessage()
    MSG message;
    if(::PeekMessage(&message, NULL, 0, 0, PM_REMOVE))
    {
    ::TranslateMessage(&message);
    ::DispatchMessage(&message);
    }通过上面这段代码可以把控制权暂时还给主程序
    当然也可以用多线程---------------------------
                    May you succeed!
                      ----------------------
      

  3.   

    MSG message;
    extern bool bAbort; // 应该是一个全局变量或成员变量,其值在按取消后设为true
    bAbort = false; 
    while(1) // 死循环
    {
      if(::PeekMessage(&message, NULL, 0, 0, PM_REMOVE))
      {
        ::TranslateMessage(&message);
        ::DispatchMessage(&message);
      }
      if (bAbort) break;  // 做其它事情
    }
      

  4.   

    如果是一个死循环你们说的什么MESSAGE都是没用的 因为死循环占用了所有的系统资源 程序根本不处理消息
      

  5.   

    如果是mfc程序可以用消息泵
    PumpMessage()
    例如:
    void CMyDlg::OnOKPressed()
    {
    m_bIsCancelPressed=FALSE;//m_bIsCancelPressed 是成员
    while(TRUE)//死循环
    {
    if(m_bIsCancelPressed)
    break;
    if(!PeekAndPump())//重新写消息循环提取并发送消息,关键
    break;
    }
    }
    void CMyDlg::OnCanclePressed()
    {
    m_bIsCancelPressed=TRUE;
    }
    BOOL CMyDlg::PeekAndPump()
    {
    MSG msg;
    while(::PeekMessage(&msg,NULL,0,0,PM_NOREMOVE))
    {
    if(!AfxGetApp()->PumpMessage())
    {
    ::PostQuitMessage(0);
    return FALSE;
    }
    }
    LONG lIdle=0;
    while(AfxGetApp()->OnIdle(lIdle++));
    return TRUE;
    }
      

  6.   

    同意 nonocast(如果你信仰光明,那是因为到处都是黑暗!) ,你想知道更详细,你去看看技术内幕吧,里面说得很清楚.Good Luck.