当前位置:编程学习 > C#/ASP.NET >>

为什么界面上两个按钮控件不能同时进行?

我在界面上放了两个按钮控件,一个start,一个stop,我按了start,它就开始向串口开始发码,一直循环发码,不会停,现在我想用stop按钮来停下这个发码过程。
可是我发现那个start按钮下的循环一直在进行,我界面上其他按钮全动不了?
怎么办啊?
求指教!!
本人是菜鸟级别的,希望大家多多指教。 --------------------编程问答-------------------- 试试用一个线程控制 --------------------编程问答-------------------- 用BackgroundWorker去做 --------------------编程问答-------------------- 弱弱地问下,是在哪个地方设置一个新线程啊?循环里面还是stop按钮下面啊? --------------------编程问答-------------------- 不是两个按钮控件不能同时的问题,是按了开始按钮后,界面都已经死掉,没办法移动了吧。 --------------------编程问答-------------------- 用BackgroundWorker控件最简单,已经给你封装好了 --------------------编程问答-------------------- 使用线程可以实现两个按钮同时用,要不你要等一个按钮执行完才能使用另一个 --------------------编程问答-------------------- 用了BackgroundWorker控件之后,我要把那串码写到同一界面的textbox(又叫sending)中,出现异常:"线程间操作无效: 从不是创建控件“sending”的线程访问它"。
这个是怎么回事啊? --------------------编程问答-------------------- 就是这样的,界面控件只能创建他的线程访问,如果可能的话,你可以在RunWorkerCompleted事件里去处理后台完成以后操作的界面,要不然就要用委托了,或者如果无所谓线程安全的话,设置控件属性CheckForIllegalCrossThreadCalls = false;
--------------------编程问答-------------------- 给你简单说明一下。


                            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);
        }

--------------------编程问答-------------------- --------------------编程问答-------------------- 同意楼上的说法 估计你是在主线程中 处理start功能的 而且是 一直循环自己不会自动停止 

界面上都没时间去接受处理消息 当然你点击不聊stop按钮了 

吧Start功能放在另外一个新建的线程里实现 

stop 在主线程里实现就行了 如上的方法有点太大材小用了 吧 
  --------------------编程问答-------------------- 如果不是急着赶项目,建议楼主使用多线程,其中知道就用到多线程和委托。熟悉这两个东西就可以了 --------------------编程问答-------------------- 多线程控制就不会卡了
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,