求问关于progressBar不能正常显示进度

fishcoder 2011-02-23 11:41:43

我想模拟一下编译器那种进度条,进度条在一直在走,旁边会显示现在编译到什么位置之类的,但是我的实现,当我动态刷新现在处于的位置的时候,进度条就不走了,求解这个应该如何解决。

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.progressBar1.Visible = true;
}

delegate void delegateString(string str);

/// <summary>
/// 修改Label的函数
/// </summary>
/// <param name="str"></param>
public void setString(string str)
{
this.label1.Text = number + "\r\n";
this.label1.Refresh();
}


int number = 0;
/// <summary>
/// 检测Number是否变化,如果变化修改相应的Label
/// </summary>
int Number
{
get
{
return number;
}
set
{
if (value != number)
{
number = value;
delegateString setStr = new delegateString(setString);
Invoke(setStr, "test");
}
}
}

/// <summary>
/// 处理函数,while循环模拟持续的计算过程
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
while (true)
{
Thread.Sleep(200);
Number = number + 1;
if (Number == 10)
break;
}
}

}
...全文
608 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
fishcoder 2011-02-24
  • 打赏
  • 举报
回复
什么+1?
你是说还是直接用Application.DoEvents么,后来那种加上没有作用呢~

[Quote=引用 6 楼 fengyarongaa 的回复:]
引用 1 楼 sp1234 的回复:

在循环里加入一句 Application.DoEvents。

+1
[/Quote]
fishcoder 2011-02-24
  • 打赏
  • 举报
回复
我的progressBar 的 Style 是Marquee的,不能用PerformStep函数
[Quote=引用 5 楼 rjinliang 的回复:]
代码中没有看到进度条的执行语句。改为这样试试:
public void setString(string str)
{
this.label1.Text = number + "\r\n";
this.label1.Refresh();
this.progressBar1.PerformStep(); //执行进度条
}
[/Quote]
fishcoder 2011-02-24
  • 打赏
  • 举报
回复
+1 是什么意思?
ycproc 2011-02-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 sp1234 的回复:]

在循环里加入一句 Application.DoEvents。
[/Quote]
+1
rjinliang 2011-02-24
  • 打赏
  • 举报
回复
代码中没有看到进度条的执行语句。改为这样试试:
public void setString(string str)
{
this.label1.Text = number + "\r\n";
this.label1.Refresh();
this.progressBar1.PerformStep(); //执行进度条
}
fishcoder 2011-02-24
  • 打赏
  • 举报
回复
大虾,现在我把循环去掉,用
Application.DoEvents();
Thread.Sleep(1000);
Number = number + 1;
Thread.Sleep(1000);
Number = number + 1;
Thread.Sleep(1000);
Number = number + 1;
Thread.Sleep(1000);
Number = number + 1;
这个来模拟,进度条还是不能正常显示,是什么问题呢?求问
fishcoder 2011-02-24
  • 打赏
  • 举报
回复
通过下面的方法可以解决,因为如果我把Sleep放在button的处理函数中的话,意味着主线程会一直Sleep,当然也就不会刷新ProgressBar,现在我将Sleep放在新起的线程中处理,主线程就可以刷新ProgressBar,大概就是这个道理,不知道我说清楚了没有。
private void test()
{
while (true)
{
Thread.Sleep(1000);
Number = number + 1;
if (Number == 10)
break;
}
}

private void button1_Click(object sender, EventArgs e)
{
Thread th = new Thread(new ThreadStart(test));
th.Start();
}
fishcoder 2011-02-24
  • 打赏
  • 举报
回复
那个我明白您的意思,当初我的循环只是在模拟一直在做不同的长时间操作。
然后在whle循环中增添那个
Application.doEvents()函数,一开始我的Sleep时间是200ms,在操作中我误以为是问题得到解决,当将时间换成原来的1000ms时,进度条仍然不能一直递增(我的进度条的Style是Marquee格式的,应该是一直在增加,和Windows启动时的一样)
当我将您给我的方法用到程序中去的时候,仍然不能解决问题,于是我就把循环去掉,变成了去除While的形式进行测试,也不行,当然也包括在每一个Number + 1后面添加Application.doEvents()函数。
现在也就是说,(其实这个和while循环无关),给Number+ 1后面加Application.doEvents()仍然不起作用。
刚开始用C#,不明之处,还请指教,谢谢!
[Quote=引用 14 楼 sp1234 的回复:]
看到#4楼的代码,我想如果你是学生,可能是非常需要换一个老师教你编程和逻辑的。

我们读代码,绝不纠缠于你是用什么编程语言写的,也不肤浅地匹配字词,而是看功能逻辑。功能逻辑,随便在一张餐巾纸上画个序列图(或者流程图),或者随便用个编程语言写出来,都是几乎一模一样的。我们看功能逻辑,而不是简单地看类似的代码单词堆砌了多少遍。
[/Quote]
  • 打赏
  • 举报
回复
看到#4楼的代码,我想如果你是学生,可能是非常需要换一个老师教你编程和逻辑的。

我们读代码,绝不纠缠于你是用什么编程语言写的,也不肤浅地匹配字词,而是看功能逻辑。功能逻辑,随便在一张餐巾纸上画个序列图(或者流程图),或者随便用个编程语言写出来,都是几乎一模一样的。我们看功能逻辑,而不是简单地看类似的代码单词堆砌了多少遍。
shaofei830927 2011-02-24
  • 打赏
  • 举报
回复
主线程跑 进度条
另起一线程跑业务逻辑 运行状态回调
  • 打赏
  • 举报
回复
循环是什么意思?不就是每当+1的时候都要DoEvents一次嘛!而你去掉了循环,还有没有........唉,晕倒啊。
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 fishcoder 的回复:]

大虾,现在我把循环去掉,用
Application.DoEvents();
Thread.Sleep(1000);
Number = number + 1;
Thread.Sleep(1000);
Number = number + 1;
Thread.Sleep(1000);
Number = number + 1;
Thread.Sleep(1000);
Number = ……
[/Quote]

跟你说循环里加一句.....,结果你把循环去掉了,说你什么好呢?!
rjinliang 2011-02-24
  • 打赏
  • 举报
回复
这样子就可以了。
private void button11_Click(object sender, EventArgs e)
{
number = 0;
this.progressBar1.Value = 0;
while (true)
{
Thread.Sleep(200);
Number = number + 1;
System.Windows.Forms.Application.DoEvents();
if (Number == 10)
break;
}
}
  • 打赏
  • 举报
回复
在循环里加入一句 Application.DoEvents。

110,534

社区成员

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

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

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