自己重载消息循环。对BUTTON消息自己以线程方式处理。
或者重载CBUTTON类,在其中实现自己的消息循环(此方法不知有没有可行性)

解决方案 »

  1.   

    你试试WaitForSingleObject函数!!
      

  2.   

    什么互斥、信号量、WaitForSingleObject我都试过了,都不能有简易的实现方法,你们能试试吗?
      

  3.   

    一定要把OnButton1Click()里的函数作为另一个线程吗???
      

  4.   

    如果Button1要执行一个长时间的动作,而且可以中途随时用Button2中止或暂停,专业的做法是应用Multi-thread, 在OnButton1()中使用CreateThread 建立工作线程返回hThread,在OnButton2()中可以用SuspendThread(hThread)暂停,或TerminateThread(hThread)强行中止这个工作线程。
      

  5.   

    to newx:
       一定要把OnButton1Click()里的函数作为另一个线程吗??? 
      

  6.   


    CMyDlg::OnButton1Click()
    {
              ...          中途挂起
              MSG Message;            
     while (::PeekMessage(&Message, NULL, 0, 0, PM_REMOVE))  
        {
     ::TranslateMessage(&Message);
     ::DispatchMessage(&Message);
     }          ...}
      

  7.   

    CMyDlg::OnButton1Click()
    {
              ...while(中途挂起的条件满足)
    {
    MSG Message;            
    while (::PeekMessage(&Message, NULL, 0, 0, PM_REMOVE))  
        {
    ::TranslateMessage(&Message);
    ::DispatchMessage(&Message);
    }
    }
              ...}
      

  8.   

    我是想在OnButton1Click()处理过程中,能响应其它事件(如单击Button2)
      

  9.   

    为你的窗口增加一个函数DoEvents(),然后在任何需要执行长时间操作的地方,增加一条对DoEvents的调用。这种方法无需多线程,简单实用。
    void CMyDlg::DoEvents()
    {
        MSG msg;
        if (::PeekMessage(&msg,NULL,0,0,PM_REMOVE)) 
        {
            if (msg.message== WM_QUIT)
            { 
                ::PostQuitMessage(-1);
            }
            if (!AfxGetApp()->PreTranslateMessage(&msg))
            {
                ::TranslateMessage(&msg);
                ::DispatchMessage(&msg);    
            }
        }
        AfxGetApp()->OnIdle(0);    
        AfxGetApp()->OnIdle(1);    
    }