我在界面上放了两个按钮控件,一个start,一个stop,我按了start,它就开始向串口开始发码,一直循环发码,不会停,现在我想用stop按钮来停下这个发码过程。
可是我发现那个start按钮下的循环一直在进行,我界面上其他按钮全动不了?
怎么办啊?
求指教!!
本人是菜鸟级别的,希望大家多多指教。

解决方案 »

  1.   

    弱弱地问下,是在哪个地方设置一个新线程啊?循环里面还是stop按钮下面啊?
      

  2.   

    用BackgroundWorker控件最简单,已经给你封装好了
      

  3.   

    用了BackgroundWorker控件之后,我要把那串码写到同一界面的textbox(又叫sending)中,出现异常:"线程间操作无效: 从不是创建控件“sending”的线程访问它"。
    这个是怎么回事啊?
      

  4.   

    就是这样的,界面控件只能创建他的线程访问,如果可能的话,你可以在RunWorkerCompleted事件里去处理后台完成以后操作的界面,要不然就要用委托了,或者如果无所谓线程安全的话,设置控件属性CheckForIllegalCrossThreadCalls = false;
      

  5.   

    给你简单说明一下。
                                BackgroundWorker backgroundWorker1 = new BackgroundWorker();
                                backgroundWorker1.DoWork += new System.ComponentModel.DoWorkEventHandler(backgroundWorker1_DoWork);
                                backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);
                                backgroundWorker1.RunWorkerAsync();
                                while (backgroundWorker1.IsBusy)
                                {
                                    Application.DoEvents();
                                }        public void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
            {
                Control.CheckForIllegalCrossThreadCalls = false;
                System.Diagnostics.Process p = new System.Diagnostics.Process();
                p.StartInfo.FileName = "cmd.exe ";
                //p.StartInfo.FileName = mencoder;
                //p.StartInfo.Arguments = Commandp;
                p.StartInfo.UseShellExecute = false;
                p.StartInfo.RedirectStandardOutput = true;
                p.StartInfo.RedirectStandardInput = true;
                p.StartInfo.CreateNoWindow = true;
                p.OutputDataReceived += new DataReceivedEventHandler(Output);
                //开始执行
                p.Start();
                p.BeginOutputReadLine();
                p.StandardInput.WriteLine(Commandp);
                p.StandardInput.WriteLine("Exit");
                p.WaitForExit();
                p.Close();
                p.Dispose();
            }        public void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
            {
                ObjState StObj1 = new ObjState();
                StObj1.value = "转换成功";
                StObj1.identifier = statusIdentifier;
                this.SetStatus(StObj1);
            }
      

  6.   

    同意楼上的说法 估计你是在主线程中 处理start功能的 而且是 一直循环自己不会自动停止 界面上都没时间去接受处理消息 当然你点击不聊stop按钮了 吧Start功能放在另外一个新建的线程里实现 stop 在主线程里实现就行了 如上的方法有点太大材小用了 吧