有关C# ProgressBar的问题

情怀河畔 2017-04-11 04:29:34
C# winform 请问怎样实现一个button点击实现进度条的清空重新开始,点击一次进度条开始,第二次点击进度条冲洗年开始,两次点击的是同一个button
...全文
433 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
情怀河畔 2017-04-14
  • 打赏
  • 举报
回复
引用 16 楼 sp1234 的回复:
[quote=引用 3 楼 qq_32318037 的回复:] th = new Thread(CrossThreadFlush); th.Start(); if (bkWorker.IsBusy) { bkWorker.CancelAsync(); //bkWorker.RunWorkerAsync(); //return; } else { // new Thread(CrossThreadFlush).Start(); bkWorker.RunWorkerAsync(); } 这是后面button事件代码,但是进度条开始到重新开始之间需要三次点击,中间的一次怎么才能去掉额
你的描述习惯,容易误导别人(当然也误导你自己)。 你这里不是只要表面上什么“进度条重新开始”,而是要让 bkWorker 停止并且立刻重新启动。如果不说实质,只说表面现象(只说进度条),总是产生误解,你自己也不会渗入到流程中。实际的流程设计往往从大白话开始,不要把重点放在说“进度条”的这种表面,要说透 DoWork 中的实质流程。[/quote] 恩恩,开始的确DoWork实质流程没完全弄明白,写了两个进程去交替控制(尴尬),现在差不多懂了,感谢大神
  • 打赏
  • 举报
回复
引用 3 楼 qq_32318037 的回复:
th = new Thread(CrossThreadFlush); th.Start(); if (bkWorker.IsBusy) { bkWorker.CancelAsync(); //bkWorker.RunWorkerAsync(); //return; } else { // new Thread(CrossThreadFlush).Start(); bkWorker.RunWorkerAsync(); } 这是后面button事件代码,但是进度条开始到重新开始之间需要三次点击,中间的一次怎么才能去掉额
你的描述习惯,容易误导别人(当然也误导你自己)。 你这里不是只要表面上什么“进度条重新开始”,而是要让 bkWorker 停止并且立刻重新启动。如果不说实质,只说表面现象(只说进度条),总是产生误解,你自己也不会渗入到流程中。实际的流程设计往往从大白话开始,不要把重点放在说“进度条”的这种表面,要说透 DoWork 中的实质流程。
  • 打赏
  • 举报
回复
所谓“等待它结束”,就是注册一个委托来捕获它的 RunWorkerCompleted 事件发生。然后当它真的触发这个“已经结束”的事件通知之后,可以再次启动它。 在捕获到事件的时候要注销我们的委托,因为在大白话里说的逻辑就是只要捕获当前这一次的完成事件,以后的事情我们不管。
  • 打赏
  • 举报
回复
用不着什么别的东西,要直截了当地按照“大白话”来设计程序,这里只需要了解一个知识点——如何用代码来注册和注销事件处理委托即可。
if (bkWorker.IsBusy)
{
    RunWorkerCompletedEventHandler proc = null;
    proc=new RunWorkerCompletedEventHandler((sender, e) =>
    {
        bkWorker.RunWorkerCompleted -= proc;
        bkWorker.RunWorkerAsync();
    });
    bkWorker.RunWorkerCompleted += proc;
    bkWorker.CancelAsync();
}
else
{
    bkWorker.RunWorkerAsync();
}
这里,当 (bkWorker.IsBusy 的时候,首先注册一个事件处理过程来捕获它结束事件,在事件回调中注销这个处理过程,并且立刻重新启动 bkWorker。最后就是发送一个“终止”标志信号给它。 这可能对于你就是“从0到1”的过程。从0到1往往是一个飞跃,需要悟性;而从1到2、到3、到.....其实就是简单的量变了。 你要建立一个事件驱动的设计模型概念。扔掉那些多余的杂念。
话与山鬼听 2017-04-13
  • 打赏
  • 举报
回复
说个思路,加一个全局变量,bool douClick = false;点一下,douClick =true;随后判断 if(douClick){.........}
情怀河畔 2017-04-11
  • 打赏
  • 举报
回复
引用 11 楼 shingoscar 的回复:
你就不能在BW取消的时候马上就开始吗?
取消时候马上开始只会是当前BW正忙啊
Poopaye 2017-04-11
  • 打赏
  • 举报
回复
你就不能在BW取消的时候马上就开始吗?
情怀河畔 2017-04-11
  • 打赏
  • 举报
回复
引用 9 楼 shingoscar 的回复:
[quote=引用 7 楼 qq_32318037 的回复:] progressBar1.Value = 0;
不是会清除吗[/quote] 这只是清掉进度条的值,然而情调之后因为条件判断不会立刻重新开始,而是等取消挂起进程下一次点击进度条才能开始运行呀 条件这里也不好改
Poopaye 2017-04-11
  • 打赏
  • 举报
回复
引用 7 楼 qq_32318037 的回复:
progressBar1.Value = 0;
不是会清除吗
情怀河畔 2017-04-11
  • 打赏
  • 举报
回复
这样做需要在同一时间启动多个后台任务,难道需要创建多个BackgroungWorker对象,每次点击很麻烦呀。
情怀河畔 2017-04-11
  • 打赏
  • 举报
回复
引用 5 楼 shingoscar 的回复:
[quote=引用 3 楼 qq_32318037 的回复:] th = new Thread(CrossThreadFlush); th.Start(); if (bkWorker.IsBusy) { bkWorker.CancelAsync(); //bkWorker.RunWorkerAsync(); //return; } else { // new Thread(CrossThreadFlush).Start(); bkWorker.RunWorkerAsync(); } 这是后面button事件代码,但是进度条开始到重新开始之间需要三次点击,中间的一次怎么才能去掉额
不清楚,毕竟这代码里,别说progressBar了,连bar的影子都没有[/quote] private BackgroundWorker bkWorker = new BackgroundWorker(); public Form1() { InitializeComponent(); bkWorker.WorkerReportsProgress = true; bkWorker.WorkerSupportsCancellation = true; bkWorker.DoWork += new DoWorkEventHandler(DoWork); bkWorker.ProgressChanged += new ProgressChangedEventHandler(ProgessChanged); } private void Form1_Load(object sender, EventArgs e) { } public int count=0; private int t = 0; private int Seconds = 90; public Thread th; private delegate void FlushClient(); public void DoWork(object sender, DoWorkEventArgs e) { e.Result = ProcessProgress(bkWorker, e); } private int ProcessProgress(object sender, DoWorkEventArgs e) { for (int i = 0; i <= 90; i++) { if (bkWorker.CancellationPending) { e.Cancel = true; return -1; } else { // 状态报告 bkWorker.ReportProgress(i); System.Threading.Thread.Sleep(1000); } } return -1; } public void ProgessChanged(object sender, ProgressChangedEventArgs e) { this.progressBar1.Value = e.ProgressPercentage; } public void CrossThreadFlush() { while (true) { Thread.Sleep(1000); ThreadFunction(); } } private void ThreadFunction() { if (this.progressBar1.InvokeRequired) { FlushClient fc = new FlushClient(ThreadFunction); this.Invoke(fc); } else { Seconds--; } } private void Form1_KeyDown(object sender, KeyEventArgs e) { if (e.KeyData == Keys.F5) { progressBar1.Value = 0; th = new Thread(CrossThreadFlush); th.Start(); if (bkWorker.IsBusy) { bkWorker.CancelAsync(); //bkWorker.RunWorkerAsync(); //return; } else { // new Thread(CrossThreadFlush).Start(); bkWorker.RunWorkerAsync(); } } } 代码差不多是这样了 有些我省略了,主要是进度条这里
crystal_lz 2017-04-11
  • 打赏
  • 举报
回复
引用 4 楼 qq_32318037 的回复:
[quote=引用 2 楼 yuwenge 的回复:] 开始之前把progress清0就可以了
progress清0是指将什么意思额[/quote] 那你认为ProgressBar是通过什么来设置进度的?。。
Poopaye 2017-04-11
  • 打赏
  • 举报
回复
引用 3 楼 qq_32318037 的回复:
th = new Thread(CrossThreadFlush); th.Start(); if (bkWorker.IsBusy) { bkWorker.CancelAsync(); //bkWorker.RunWorkerAsync(); //return; } else { // new Thread(CrossThreadFlush).Start(); bkWorker.RunWorkerAsync(); } 这是后面button事件代码,但是进度条开始到重新开始之间需要三次点击,中间的一次怎么才能去掉额
不清楚,毕竟这代码里,别说progressBar了,连bar的影子都没有
情怀河畔 2017-04-11
  • 打赏
  • 举报
回复
引用 2 楼 yuwenge 的回复:
开始之前把progress清0就可以了
progress清0是指将什么意思额
情怀河畔 2017-04-11
  • 打赏
  • 举报
回复
th = new Thread(CrossThreadFlush); th.Start(); if (bkWorker.IsBusy) { bkWorker.CancelAsync(); //bkWorker.RunWorkerAsync(); //return; } else { // new Thread(CrossThreadFlush).Start(); bkWorker.RunWorkerAsync(); } 这是后面button事件代码,但是进度条开始到重新开始之间需要三次点击,中间的一次怎么才能去掉额
卧_槽 2017-04-11
  • 打赏
  • 举报
回复
开始之前把progress清0就可以了
xdashewan 2017-04-11
  • 打赏
  • 举报
回复
加个全局标志位判断下

111,098

社区成员

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

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

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