窗体上两按钮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的单击事件如下
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事件的执行,如暂停,继续,停止等等!
{
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;
}
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;
}
知道ProgessBar和BackgroundWorker控件,不知道该如何加进去?
ProgessBar只能在代码中设置百分比么?
BackgroundWorker没有百分比的显示么?
请教是否把button1的事件放入一个线程Thread1中执行,用进度条显示执行状况,
而用button2或更多控件来控制Thread1的停止,继续,暂停,重启动呢?
这个是什么方法?
{
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;
}
}
第二次以后需要点两次才达到预期目的,不知道是怎么回事?
这个最好还是用线程或者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;
}
ms-help://MS.MSDNQTR.v80.chs/MS.MSDN.v80/MS.NETDEVFX.v20.chs/cpref3/html/T_System_ComponentModel_BackgroundWorker.htm
首先在窗体上有
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;
}
}
}