我有一个程序,在窗体上有一个按钮,比如说叫“start”。当我点击按钮时,按钮变为“stop”,程序进入一个较大的循环来处理一些事情;如果点击“stop”按钮退出大循环。问题是:当这个大循环运行完毕前,程序会像死了一样,此时“stop”按钮不能点击。原因是这个循环以阻塞方式运行。可以用线程来解决,但是有没有办法不使用线程来解决呢?关键是如何解决大循环运行后,“stop”按钮不能点击的问题。

解决方案 »

  1.   

    不行的。windows程序是以进程为单位,进程本身是没有活动能力的,必须在进程里面运行线程来,而你所描述的程序实际上已经有了一个主线程,也就是界面线程,如果你在这个线程里面去进行你的大循环的话,那肯定会阻塞界面。
    当然,也可以让你的大循环运新一段时间,就停一下,来达到界面线程得到消息响应,但是这样做恐怕不是你所要的效果。
      

  2.   

    在循环里调
    AfxGetApp()->PumpMessage();
      

  3.   

    两个办法,1。如楼上在循环里调AfxGetApp()->PumpMessage();2。把循环去掉,执行体放在OnTimer中,用按钮SetTimer和KillTimer。
      

  4.   

    点击Start
    BOOL m_bStart;
    OnStart()
    {
      m_bStart = TRUE;
      for(int i=0;i<10000;i++)
      {
        AfxGetApp()->PumpMessage();
        if( !m_bStart )
             break;
        //处理    
      }  
    }OnStop
    {
      m_bStart = FALSE;
    }
      

  5.   

    将大循环放到一个函数中,然后绑定一消息,在按钮消息里发送PostMessage(消息);