窗体上两按钮button1,button2和一个lable1;
按钮1的单击事件如下
private void button1_Click(object sender, EventArgs e)
            {
                  label1.Refresh();
                  label1.Text = "";
                  for (int i = 0; i < 10000&&run==false; i++)
                  {
                        label1.Text = i.ToString();
                        label1.Refresh();
                        System.Threading.Thread.Sleep(100);
                  }
            }
也就是按钮1不停循环改变lable1的文字;问题:怎么实现用button2来控制button1事件的执行,如暂停,继续,停止等等!

解决方案 »

  1.   

    加个flag,在button1里面判断,button2负责修改
      

  2.   

    这个,说来也容易。原理就不废话了。public enum RunState
    {
         running,
         pause,
         suppend
    }RunState state = RunState.suppend;
    bool Restart = false;RunProc(...)//执行的部分
    {
         while(state != RunState.suppend)
         {
              //执行操作
               Application.DoEvents();
              if(state == RunState.suppend) break;//保证可以正常退出
              while(state == RunState.pause)//保证可以暂停,不过这样效率不高:)但实现这个功能也只能如此了。
              {
                   Application.DoEvents();
              }
         }
         if(Restart)
         {
              Restart = False;
              Button2.PerformClick();
         }
    }Button2_Clicked(...)//开始
    {
         if(state != RunState.suppend)
         {
              state = RunState.suppend;
              Restart = true;
         }
         state = RunState.running;
         RunProc();
    }Button3_Clicked(...)//暂停
    {
         state = RunState.pause;
    }Button4_Clicked(...)//停止
    {
         state = RunState.suppend;
    }
      

  3.   

    没有编译器调试,就随手写的,貌似上面写错了一点。用下面的
    public enum RunState
    {
         running,
         pause,
         suppend
    }RunState state = RunState.suppend;
    bool Restart = false;RunProc(...)//执行的部分
    {
         while(state != RunState.suppend)
         {
              //....................//
              //执行你的操作
              Application.DoEvents();
              if(state == RunState.suppend) break;//保证可以正常退出
              while(state == RunState.pause)//保证可以暂停,不过这样效率不高:)但实现这个功能也只能如此了。
              {
                   Application.DoEvents();
              }
         }
         if(Restart)
         {
              Restart = False;
              Button2.PerformClick();
         }
    }Button2_Clicked(...)//开始
    {
         if(state != RunState.suppend)
         {
              state = RunState.suppend;
              Restart = true;
              return;//修改了这里,要退出栈
         }
         state = RunState.running;
         RunProc();
    }Button3_Clicked(...)//暂停
    {
         state = RunState.pause;
    }Button4_Clicked(...)//停止
    {
         state = RunState.suppend;
    }
      

  4.   

    如果想效率高。就单独启动一个线程来执行RunProc
      

  5.   

    为了使用户界面更友好点,我想加入进度条显示执行的百分比该如何?
    知道ProgessBar和BackgroundWorker控件,不知道该如何加进去?
    ProgessBar只能在代码中设置百分比么?
    BackgroundWorker没有百分比的显示么?
      

  6.   

    本人对多线程不是很熟悉!
    请教是否把button1的事件放入一个线程Thread1中执行,用进度条显示执行状况,
    而用button2或更多控件来控制Thread1的停止,继续,暂停,重启动呢?
      

  7.   

    To:wuyazhe Button2.PerformClick();
    这个是什么方法?
      

  8.   

    button2和Button2失误了,谢谢!
      

  9.   

    依照“wuyazhe ”的方法实现了,不过有待改进!public partial class Form1 : Form
          {
                public enum RunState
                {
                      running,
                      pause,
                      suppend
                }            RunState state = RunState.suppend;
                bool Restart = false;            public Form1()
                {
                      InitializeComponent();
                }            private void RunProc()//执行的部分
                {
                      label1.Refresh();
                      label1.Text = ""; 
                      for (int i = 0; i < 10000 && state != RunState.suppend;i++ )
                      {                        label1.Text = i.ToString();
                            label1.Refresh();
                            DateTime time = DateTime.Now;
                            while ((DateTime.Now - time) < TimeSpan.FromMilliseconds(200))
                            { }
                            Application.DoEvents();
                            if (state == RunState.suppend) break;//保证可以正常退出
                            while (state == RunState.pause)//保证可以暂停,不过这样效率不高:)但实现这个功能也只能如此了。
                            {
                                  Application.DoEvents();
                            }
                      }
                     if(Restart)
                     {
                          Restart = false;
                          button2.PerformClick();
                     }
                }            private void button1_Click(object sender, EventArgs e)
                {
                      if (state != RunState.suppend)
                      {
                            state = RunState.suppend;
                            Restart = true;
                            return;//修改了这里,要退出栈
                      }
                      state = RunState.running;
                      RunProc();
                }            private void button2_Click(object sender, EventArgs e)
                {
                      state = RunState.pause;
                }            private void button3_Click(object sender, EventArgs e)
                {
                      state = RunState.suppend;
                }
          }
      

  10.   

    第一次点button1和button2后,
    第二次以后需要点两次才达到预期目的,不知道是怎么回事?
      

  11.   

    改了下,Restart没看出有什么实际的用处所以删掉了。
    这个最好还是用线程或者BackgroundWorker,用法很简单,参考MSDN
            public enum RunState
            {
                running,
                pause,
                suppend
            }        RunState state = RunState.suppend;
            int i = 0;        private void RunProc()//执行的部分
            {
                while(i<10000)
                {
                    label1.Text = i.ToString();
                    label1.Refresh();
                    System.Threading.Thread.Sleep(200);
                    Application.DoEvents();
                    if (state == RunState.suppend)
                    {
                        i = 0;
                        label1.Text = i.ToString();
                        label1.Refresh();
                        break;//保证可以正常退出
                    }
                    while (state == RunState.pause)//保证可以暂停,不过这样效率不高:)但实现这个功能也只能如此了。
                    {
                        Application.DoEvents();
                    }                i++;
                }
            }        private void button1_Click(object sender, EventArgs e)
            {
                if (state != RunState.suppend)
                {
                    state = RunState.running;
                    return;//修改了这里,要退出栈
                }
                state = RunState.running;
                label1.Refresh();
                label1.Text = "";
                RunProc();
            }        private void button2_Click(object sender, EventArgs e)
            {
                state = RunState.pause;
            }        private void button3_Click(object sender, EventArgs e)
            {
                state = RunState.suppend;
            }
      

  12.   

    参考MSDN实例:下面的代码示例演示如何使用 BackgroundWorker 类异步执行耗时的操作。该操作计算选定的斐波纳契数,在计算过程中报告进度更新,并允许取消挂起的计算。
    ms-help://MS.MSDNQTR.v80.chs/MS.MSDN.v80/MS.NETDEVFX.v20.chs/cpref3/html/T_System_ComponentModel_BackgroundWorker.htm
      

  13.   

    暂停,继续,停止得以实现,使用Timer控件!
    首先在窗体上有
    lable1,//运行显示
    button1,//开始
    button2,//暂停和继续
    button3//停止
    窗体上还放Timer控件timer1代码实现如下,using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;namespace testMain
    {
          public partial class Form1 : Form
          {
                public enum RunState
                {
                      running,
                      pause,
                      stop
                }            private int i = 0;            RunState state = RunState.stop;            public Form1()
                {
                      InitializeComponent();
                }            private void RunProc(object sender,EventArgs e)//执行的部分
                {
                      timer1.Enabled = false;
                      if (state == RunState.running)
                      {
                            label1.Refresh();
                            label1.Text = "";
                            label1.Text = i.ToString();
                            label1.Refresh();
                            i++;
                            timer1.Enabled = true;
                      }
                }            private void button1_Click(object sender, EventArgs e)
                {
                      if (this.button1.Text == "开始")
                      {
                            this.button1.Enabled = false;
                            this.button2.Enabled = true;
                            this.button3.Enabled = true;                        timer1.Tick += new EventHandler(RunProc);
                            timer1.Enabled = true;                        this.state = RunState.running;
                      }
                }            private void button2_Click(object sender, EventArgs e)
                {
                      if (this.button2.Text == "暂停")
                      {
                            timer1.Enabled = false;
                            state = RunState.pause;                        this.button2.Text = "继续";
                      }
                      else
                      {
                            timer1.Enabled = true;
                            this.state = RunState.running;
                            this.button2.Text = "暂停";
                            this.button2.Enabled = true;
                            //timer1.Start();
                      }
                }            private void button3_Click(object sender, EventArgs e)
                {
                      this.timer1.Enabled = false;
                      this.i = 0;
                      this.label1.Text = "0";
                      this.state = RunState.stop;                   this.button1.Text = "开始";
                      this.button1.Enabled = true;
                      this.button2.Text = "暂停";
                      this.button2.Enabled = false;
                      this.button3.Enabled=false;
                }            private void Form1_Load(object sender, EventArgs e)
                {
                      this.label1.Text = "0";
                      this.button2.Enabled = false;
                      this.button3.Enabled = false;
                }
          }
    }