采用的是backgroundworker,下面是里面的函数,主要就是调用一个后台对程序进行编译的过程,showdrawform是一个委托,里面会建立一个窗体(我知道这样做可能不太合理,但是我没有更好的办法),说下程序的功能:通过dos命令,进入相关目录,然后执行命令编译,编译完生成文件1(对应命令setever),然后执行命令转换(对应命令converse),转换完生成文件2,然后启用showdrawform函数,生成一个对话框。在此对话框From_Load事件中会去读取文件2,但是现在执行这段代码会卡死,请大家参谋下
        private void OnBackgroundWorker1DoWork(object sender, DoWorkEventArgs e)
        {
            System.Diagnostics.ProcessStartInfo psi = new System.Diagnostics.ProcessStartInfo("cmd");
            psi.RedirectStandardInput = true;
            psi.RedirectStandardOutput = true;
            psi.UseShellExecute = false;
            psi.CreateNoWindow = false;            
            System.Diagnostics.Process p = System.Diagnostics.Process.Start(psi);            p.StandardInput.WriteLine(@"cd\");
            p.StandardInput.WriteLine(@"d:");
            p.StandardInput.WriteLine(@"cd\");
            p.StandardInput.WriteLine(@"cd ADS2008U2");
            p.StandardInput.WriteLine(@"cd bin");
            p.StandardInput.WriteLine(@"hpeesofmbshell_new");            Thread.Sleep(1000);            p.StandardInput.WriteLine(@"cd\");
            p.StandardInput.WriteLine(@"c:");
            p.StandardInput.WriteLine(@"cd\");
            p.StandardInput.WriteLine(@"cd users");
            p.StandardInput.WriteLine(@"cd default");
            p.StandardInput.WriteLine(@"cd adsptolemy");
            p.StandardInput.WriteLine(@"cd bin");
            p.StandardInput.WriteLine(@"mbsetvars");
            p.StandardInput.WriteLine(@"set SIMARCH=win32");            Thread.Sleep(100);            p.StandardInput.WriteLine(@"cd\");
            p.StandardInput.WriteLine(@"e:");
            p.StandardInput.WriteLine(@"cd\");
            p.StandardInput.WriteLine(@"cd Project");
            p.StandardInput.WriteLine(@"cd ADS");
            //这里需要改
            switch(this.SimulateType)
            {
                case "4_1_1":
                    {
                        p.StandardInput.WriteLine(@"cd SAM_SUC_AMUFA_PI4DQPSK_prj");
                    }
                    break;                case "4_1_2":
                    {
                        p.StandardInput.WriteLine(@"cd SAM_SUC_AMUFA_QPSK_prj");
                    }
                    break;                case "4_1_3":
                    {
                        p.StandardInput.WriteLine(@"cd SAM_SUC_AMUFA_NFsys_prj");
                    }
                    break;                case "4_1_4":
                    {
                        p.StandardInput.WriteLine(@"cd SAM_SUC_AMUFA_CNR_prj");
                    }
                    break;                case "4_1_5":
                    {
                        p.StandardInput.WriteLine(@"cd SAM_SUC_AMLFA_GComp_prj");
                    }
                    break;                case "4_1_11":
                    {
                        p.StandardInput.WriteLine(@"cd SAM_DUC_AMUFAMUFA_PI4DQPSK_prj");
                    }
                    break;                case "4_1_12":
                    {
                        p.StandardInput.WriteLine(@"cd SAM_DUC_AMUFAMUFA_QPSK_prj");
                    }
                    break;                case "4_1_13":
                    {
                        p.StandardInput.WriteLine(@"cd SAM_DUC_AMUFAMUFA_NFsys_prj");
                    }
                    break;                case "4_1_14":
                    {
                        p.StandardInput.WriteLine(@"cd SAM_DUC_AMUFAMUFA_CNR_prj");
                    }
                    break;                case "4_1_15":
                    {
                        p.StandardInput.WriteLine(@"cd SAM_DUC_AMUFAMUFA_GComp_prj");
                    }
                    break;                case "4_1_21":
                    {
                        p.StandardInput.WriteLine(@"cd SAM_SDC_AMFA_PI4DQPSK_prj");
                    }
                    break;                case "4_1_22":
                    {
                        p.StandardInput.WriteLine(@"cd SAM_SDC_AMFA_QPSK_prj");
                    }
                    break;                case "4_1_23":
                    {
                        p.StandardInput.WriteLine(@"cd SAM_SDC_AMFA_NFsys_prj");
                    }
                    break;                case "4_1_24":
                    {
                        p.StandardInput.WriteLine(@"cd SAM_SDC_AMFA_CNR_prj");
                    }
                    break;                case "4_1_25":
                    {
                        p.StandardInput.WriteLine(@"cd SAM_SDC_AMFA_GComp_prj");
                    }
                    break;                case "4_1_26":
                    {
                        p.StandardInput.WriteLine(@"cd SAM_DDC_AMFAMFA_PI4DQPSK_prj");
                    }
                    break;                case "4_1_27":
                    {
                        p.StandardInput.WriteLine(@"cd SAM_DDC_AMFAMFA_QPSK_prj");
                    }
                    break;                case "4_1_28":
                    {
                        p.StandardInput.WriteLine(@"cd SAM_DDC_AMFAMFA_NFsys_prj");
                    }
                    break;                case "4_1_29":
                    {
                        p.StandardInput.WriteLine(@"cd SAM_DDC_AMFAMFA_CNR_prj");
                    }
                    break;                case "4_1_30":
                    {
                        p.StandardInput.WriteLine(@"cd SAM_DDC_AMFAMFA_GComp_prj");
                    }
                    break;                case "4_2_1":
                    {
                        p.StandardInput.WriteLine(@"cd SAM_Analog_Channel_prj");
                    }
                    break;                case "4_2_2":
                    {
                        p.StandardInput.WriteLine(@"cd SAM_IFM_CORR_4_Channel_prj");
                    }
                    break;                case "4_3_1":
                    {
                        p.StandardInput.WriteLine(@"cd SPM_CHIRP_RADAR_SYSTEM_2_prj");
                    }
                    break;                case "4_3_2":
                    {
                        p.StandardInput.WriteLine(@"cd SPM_three_channel_monopulse_prj");
                    }
                    break;                case "4_4":
                    {
                        p.StandardInput.WriteLine(@"cd SSM_Multipath1_prj");
                    }
                    break;            }
            p.StandardInput.WriteLine(@"SetEver");
            while (true)
            {
                Application.DoEvents();
                
                Thread.Sleep(100);
                //此函数列举所有进程,并检验进程1是否存在,存在返回true,否则返回false
                bool b = CheckProcess1();                
                if (b == false)
                {
                    
                    p.StandardInput.WriteLine(@"Converse");                    while (true)
                    {
                        Application.DoEvents();                        //检查进程2是否存在
                        bool b2 = CheckProcess2();
                      
                        if (b2 == false)
                        {
                                                        backgroundWorker1.CancelAsync();
                            ShowDrawForm();
                            break;                        }
                        else
                        {
                          
                            Thread.Sleep(1);
                        }
                    }
                    break;
                }
                else
                {
               
                    Thread.Sleep(1);
                }
            }            
        }

解决方案 »

  1.   

    Sleep(1)对pc实际没用。pc的时钟精度是10ms
      

  2.   

    在此对话框From_Load事件中会去读取文件2,但是现在执行这段代码会卡死,请大家参谋下没有看到你这个代码,贴出来看?
      

  3.   

    说sleep(1)没用?我觉得不太准确,sleep(1)的用途是挂起本线程,让位于其他线程,为了并发。精度10ms?依据?我印象中比这长,可能因Framwork的版本不同有差异,2.0中比这个要高,大概30吧