晕死了,进度条没读完就达到最大值
我设置进度条的最大值为1000但是,进度条在视觉上还有一大截没读完,就到1000了,
这是摸个原因? --------------------编程问答-------------------- 设置进度后加一句
进度条.refresh --------------------编程问答-------------------- 代码计算错误,一般是代码处理过程不正确 --------------------编程问答--------------------
很简单的计算啊,确定list是1000个元素
int i = 0;
foreach(string s in list)
{
i++;
backgroundWorker1.ReportProgress(i);
}
这种没对吗?当然还有代码,并不会影响value值的 --------------------编程问答-------------------- 太快了
肉眼看不出过程
Sleep
--------------------编程问答-------------------- backgroundWorker1.ReportProgress(i);在msdn里面查了下 这个方法是异步的 就是说在执行这个方法的时候 你的循环体其实还在跑 比如i=500的时候 backgroundWorker1.ReportProgress(i);方法执行可能要10MS 这10MS的时候你的i已经等于1000并且退出循环了 所以等于说没有把i=1000的时候更新上去 --------------------编程问答-------------------- 有人知道吗? --------------------编程问答-------------------- 你可以在循环外面再加一句backgroundWorker1.ReportProgress(i); --------------------编程问答-------------------- 我觉得也是代码处理错误的原因 --------------------编程问答--------------------
--------------------编程问答-------------------- 都说加sleep了嘛 --------------------编程问答-------------------- 系统进度条显示有延迟,如果赋值太快是到不了头 --------------------编程问答--------------------
private void button2_Click(object sender, EventArgs e)
{
BackgroundWorker wb = new BackgroundWorker();
wb.DoWork += new DoWorkEventHandler(wb_DoWork);
wb.ProgressChanged += new ProgressChangedEventHandler(wb_ProgressChanged);
wb.WorkerReportsProgress = true;
wb.RunWorkerAsync();
}
void wb_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 0; i <= 1000; i++)
{
BackgroundWorker wb = sender as BackgroundWorker;
wb.ReportProgress(i);
Thread.Sleep(10);
}
}
void wb_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
}
没有其他办法了吗,难道只有sleep了吗?我试了一下,效果是有的,但是总时间增加了不少啊,不知实情的还以为程序运行这么慢 --------------------编程问答-------------------- 好像只有100吧
--------------------编程问答-------------------- while(条件=true)
{
执行语句
进度条当前值=计算到的值
}
在这,如果还有值,就将这个最大值给就行了,何必折腾呢。 --------------------编程问答--------------------
说明你代码逻辑可能有问题,你看看我上面的代码,我写个sleep只是为了让条跑慢点,不用也是OK的。
根据逻辑来说,不管多快都不会出问题的。ReportProgress的时候是一个同步线程去操作的。 --------------------编程问答-------------------- 不整个代码贴出来是找不到你的真因所在的,就这样看没问题啊 ,你试试就这样运行下 只是太快而已 --------------------编程问答--------------------
private void button6_Click(object sender, EventArgs e)
{
progressBar1.Visible = true; //先显式
backgroundWorker1.RunWorkerAsync();
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
调用方法a();
调用方法b();
}
backgroundWorker1.ReportProgress(Int32); //进度条报告进度
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage; //进度条获取值
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
progressBar1.Visible = false; //异步执行完成后,隐藏进度条
}
private void 方法a()
{
}
private void 方法b()
{
int i = 0;
foreach(string s in list)
{
i++;
backgroundWorker1.ReportProgress(i); //进度条报告进度
}
} --------------------编程问答-------------------- 我觉得这个办法最准确
--------------------编程问答-------------------- 先调用方法a 在调用方法b啊,那在运行a的过程中,进度条是不会变化的啊 。
然后一下子就运行b了。 如果b是这么简单的代码, 0.01秒内就可以把1000条数完啦,你看到的当然是一闪而过啦
我是这样用的
For j = 0 To rowscount - 1
For i = 0 To columcount - 1
Sarray(j, i) = DataGridView1.Item(i, j).Value
Next
percent = j / (rowscount - 1) * 90
BackgroundWorker1.ReportProgress(percent)
Next
Private Sub BackgroundWorker1_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
ProgressBar1.Value = e.ProgressPercentage
End Sub
运行最后步骤再变成100 --------------------编程问答-------------------- 用delegate去更新UI试试呢。 --------------------编程问答--------------------
试过的,不起作用,我本身就放在循环的最后一句 --------------------编程问答--------------------
试过,不起作用 --------------------编程问答--------------------
你sleep效果是有的,证明问题不是出现在显示上面,而是你的代码上面,(进度条太快)。
你需要做的是在需要等待的过程里面分步添加 BackgroundWorker1.ReportProgress(int)
而不是等待的过程完了 才去搞个循环一下子把进度条填满 --------------------编程问答-------------------- 其实,太快了不是加Sleep,而是要加Application.DoEvents();
--------------------编程问答--------------------
要找个时间给系统刷新显示 paint,但是BackgroundWorker本身就是一个新线程,他本身是不会妨碍主界面刷新的 --------------------编程问答-------------------- 可以设置进度条的最大值为1000 --------------------编程问答-------------------- 我只是来围观一下!! --------------------编程问答-------------------- 1年前的帖子?楼主会回来收尸吗? --------------------编程问答-------------------- 应该是视觉问题吧,不然你在程序中写个到999暂停的代码试试 --------------------编程问答-------------------- 这种坟有什么好挖的... --------------------编程问答-------------------- 主次搞错了,对才怪
补充:.NET技术 , C#