[请教][难度问题]按钮事件中有循环的问题,用另一个按钮控制停止,暂停,继续

龙宜坡 2007-10-27 11:32:21
窗体上两按钮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事件的执行,如暂停,继续,停止等等!
...全文
392 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
guyehanxinlei 2007-10-27
  • 打赏
  • 举报
回复
同意楼上
SDFDSAC 2007-10-27
  • 打赏
  • 举报
回复
加个flag,在button1里面判断,button2负责修改
龙宜坡 2007-10-27
  • 打赏
  • 举报
回复
谢谢,我再想法加个进度条之类的东西!
龙宜坡 2007-10-27
  • 打赏
  • 举报
回复
暂停,继续,停止得以实现,使用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;
}
}
}
SDFDSAC 2007-10-27
  • 打赏
  • 举报
回复
参考MSDN实例:下面的代码示例演示如何使用 BackgroundWorker 类异步执行耗时的操作。该操作计算选定的斐波纳契数,在计算过程中报告进度更新,并允许取消挂起的计算。
ms-help://MS.MSDNQTR.v80.chs/MS.MSDN.v80/MS.NETDEVFX.v20.chs/cpref3/html/T_System_ComponentModel_BackgroundWorker.htm
SDFDSAC 2007-10-27
  • 打赏
  • 举报
回复
改了下,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;
}
龙宜坡 2007-10-27
  • 打赏
  • 举报
回复
第一次点button1和button2后,
第二次以后需要点两次才达到预期目的,不知道是怎么回事?
龙宜坡 2007-10-27
  • 打赏
  • 举报
回复
依照“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;
}
}
龙宜坡 2007-10-27
  • 打赏
  • 举报
回复
button2和Button2失误了,谢谢!
龙宜坡 2007-10-27
  • 打赏
  • 举报
回复
To:wuyazhe

Button2.PerformClick();
这个是什么方法?
龙宜坡 2007-10-27
  • 打赏
  • 举报
回复
本人对多线程不是很熟悉!
请教是否把button1的事件放入一个线程Thread1中执行,用进度条显示执行状况,
而用button2或更多控件来控制Thread1的停止,继续,暂停,重启动呢?
龙宜坡 2007-10-27
  • 打赏
  • 举报
回复
为了使用户界面更友好点,我想加入进度条显示执行的百分比该如何?
知道ProgessBar和BackgroundWorker控件,不知道该如何加进去?
ProgessBar只能在代码中设置百分比么?
BackgroundWorker没有百分比的显示么?
aamaomao 2007-10-27
  • 打赏
  • 举报
回复
用个线程来做不就行了,暂停、继续和停止直接操作这个线程
兔子-顾问 2007-10-27
  • 打赏
  • 举报
回复
如果想效率高。就单独启动一个线程来执行RunProc
兔子-顾问 2007-10-27
  • 打赏
  • 举报
回复
没有编译器调试,就随手写的,貌似上面写错了一点。用下面的


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



兔子-顾问 2007-10-27
  • 打赏
  • 举报
回复
这个,说来也容易。原理就不废话了。

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

111,098

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧