我写了一个对话框的控制程序,可是运行的时候就像死了一样,在程序间切换也不行,对话框拖动也不行,等程序执行完又正常了这是什么原因啊?怎么改?

解决方案 »

  1.   

    能运行,结果也是对的,就是运行的时候不能去,点击界面和做拖动什么的动作,不然就像死机了一样
    void CLHKONG_420Dlg::OnRun() 
    {
    // TODO: Add your control notification handler code here
    CString str_x,str_y,
        str1,str4,str5,
        str_step,
        str_dx,str_dy,str_xunhuan,str_xunhuandanqian,
    str_beizeng1,str_beizeng2,
    str_pwm,str_pwmbeizeng;
        str_x = "X+";
    str_y = "Y+";
    str_step = "1";
    str1 = "\r\n";
        double a,l1,l2,
       l_stepnum,
       l_beizeng1,l_beizeng2,
       l_pwm,l_pwmup1,l_pwmup2;
      a=0;
    //l_step,
    //循环设置
    GetDlgItemText( IDC_EDIT_XUNHUAN , str_xunhuan );
    l1 = atof ( str_xunhuan );   
        //步长设置
        GetDlgItemText( IDC_EDIT_STEP , str_step );
    l_stepnum = atof ( str_step );   
    //l_step = 0.0125 * l_stepnum;
    str_dx = str_x + str_step + str1;
    str_dy = str_y + str_step + str1;
    //turn on lz
    CByteArray sandArray_on;
    sandArray_on.RemoveAll();
    sandArray_on.SetSize(1);
        sandArray_on.SetAt( 0, 0x75 );
       //turn off lz
    CByteArray sandArray_off;
    sandArray_off.RemoveAll();
    sandArray_off.SetSize(1);
        sandArray_off.SetAt( 0 , 0x76 );
    //turn up lz
    CByteArray sandArray_up;
    sandArray_up.RemoveAll();
    sandArray_up.SetSize(2);
        sandArray_up.SetAt( 0 , 0x7F );
    //功率倍增点设置
    GetDlgItemText( IDC_EDIT_BEIZENG1 , str_beizeng1 );
    l_beizeng1 = atof ( str_beizeng1 );   
    GetDlgItemText( IDC_EDIT_BEIZENG2 , str_beizeng2 );
    l_beizeng2 = atof ( str_beizeng2 );
        //功率倍增点
        GetDlgItemText( IDC_EDIT_PWM , str_pwm );
    l_pwm = atof( str_pwm );
    l_pwmup1 = 2*l_pwm;
        //progress
    m_progress.SetRange( 0 , l1 );
        //turn on lz
        m_mscom_jg.SetOutput( COleVariant ( sandArray_on ) );
        //move 
    Sleep ( 10000 );
    for ( l2=1 ; l2<=l1 ; l2++ )
       {
      str_xunhuandanqian.Format( "%0.0f" , l2 );
         SetDlgItemText ( IDC_EDIT_XUNHUANDANQIAN , str_xunhuandanqian );
      int nTemp = (int) (l2 * l_stepnum * 2); //总步数
              if ( ( l2 * l_stepnum * 2 ) >= l_beizeng1  && ( l2 * l_stepnum * 2 ) < l_beizeng2 &&  nTemp%50 == 0 )//每50步递增0.5%功率
      {
         a++;
         l_pwmup2 = l_pwmup1 + a;
          sandArray_up.SetAt( 1 , l_pwmup2 );
             m_mscom_jg.SetOutput( COleVariant ( sandArray_up ) );
                 str_pwmbeizeng.Format( "%0.2f" , l_pwmup2/2 );
         SetDlgItemText ( IDC_EDIT_PWM , str_pwmbeizeng );
      }
              else if ( (l2 * l_stepnum * 2) >= l_beizeng2 && nTemp%25 == 0  )
      {
         a++;
         l_pwmup2 = l_pwmup1 + a;
          sandArray_up.SetAt( 1 , l_pwmup2 );
             m_mscom_jg.SetOutput( COleVariant ( sandArray_up ) );
                 str_pwmbeizeng.Format( "%0.2f" , l_pwmup2/2 );
         SetDlgItemText ( IDC_EDIT_PWM , str_pwmbeizeng );
      }
      //X
          m_mscom_dj.SetOutput( COleVariant ( str_dx ) );
      Sleep( 200 );
          m_xzhou = m_xzhou + l_stepnum;
          str4.Format( "%0.0f" , m_xzhou );
          SetDlgItemText ( IDC_EDIT_XZHOU , str4 );
              //Y
      m_mscom_dj.SetOutput( COleVariant ( str_dy ) );
      Sleep ( 200 );
             m_yzhou = m_yzhou + l_stepnum;
          str5.Format( "%0.0f" , m_yzhou );
          SetDlgItemText ( IDC_EDIT_YZHOU , str5 );
           //progress
      m_progress.SetPos ( l2 );
            UpdateWindow();   
       }
    Sleep( 20 );
    //turn off lz
        m_mscom_jg.SetOutput( COleVariant ( sandArray_off ) );}
      

  2.   

    肯定要开线程,主线程都sleep了,怎么处理你发去的消息(鼠标点击、拖动、显示之类的)
      

  3.   

    创建线程可以用CreateThread、AfxBeginThread、_beginthread等函数,把this指针作为参数传给线程,在线程中把参数转换为CLHKONG_420Dlg*类型,用该指针访问对话框类成员,把UpdateWindow函数去掉。