当前位置:编程学习 > C#/ASP.NET >>

晕死了,进度条没读完就达到最大值

我设置进度条的最大值为1000
但是,进度条在视觉上还有一大截没读完,就到1000了,
这是摸个原因? --------------------编程问答-------------------- 设置进度后加一句
进度条.refresh --------------------编程问答-------------------- 代码计算错误,一般是代码处理过程不正确 --------------------编程问答--------------------
引用 2 楼  的回复:
代码计算错误,一般是代码处理过程不正确

很简单的计算啊,确定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); --------------------编程问答-------------------- 我觉得也是代码处理错误的原因 --------------------编程问答--------------------

        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了嘛 --------------------编程问答-------------------- 系统进度条显示有延迟,如果赋值太快是到不了头 --------------------编程问答--------------------
引用 11 楼  的回复:
系统进度条显示有延迟,如果赋值太快是到不了头

没有其他办法了吗,难道只有sleep了吗?我试了一下,效果是有的,但是总时间增加了不少啊,不知实情的还以为程序运行这么慢 --------------------编程问答-------------------- 好像只有100吧
--------------------编程问答-------------------- while(条件=true)
{
    执行语句
    进度条当前值=计算到的值
}
在这,如果还有值,就将这个最大值给就行了,何必折腾呢。 --------------------编程问答--------------------
引用 12 楼  的回复:
引用 11 楼  的回复:

系统进度条显示有延迟,如果赋值太快是到不了头

没有其他办法了吗,难道只有sleep了吗?我试了一下,效果是有的,但是总时间增加了不少啊,不知实情的还以为程序运行这么慢


说明你代码逻辑可能有问题,你看看我上面的代码,我写个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); //进度条报告进度
}
} --------------------编程问答-------------------- 我觉得这个办法最准确

引用 14 楼  的回复:
while(条件=true)
{
  执行语句
  进度条当前值=计算到的值
}
在这,如果还有值,就将这个最大值给就行了,何必折腾呢。
--------------------编程问答-------------------- 先调用方法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试试呢。 --------------------编程问答--------------------
引用 14 楼  的回复:
while(条件=true)
{
    执行语句
    进度条当前值=计算到的值
}
在这,如果还有值,就将这个最大值给就行了,何必折腾呢。

试过的,不起作用,我本身就放在循环的最后一句 --------------------编程问答--------------------
引用 20 楼  的回复:
用delegate去更新UI试试呢。

试过,不起作用 --------------------编程问答--------------------
引用 22 楼  的回复:
引用 20 楼  的回复:

用delegate去更新UI试试呢。

试过,不起作用


你sleep效果是有的,证明问题不是出现在显示上面,而是你的代码上面,(进度条太快)。

你需要做的是在需要等待的过程里面分步添加   BackgroundWorker1.ReportProgress(int)

而不是等待的过程完了  才去搞个循环一下子把进度条填满 --------------------编程问答-------------------- 其实,太快了不是加Sleep,而是要加Application.DoEvents();

--------------------编程问答--------------------
引用 24 楼  的回复:
其实,太快了不是加Sleep,而是要加Application.DoEvents();


要找个时间给系统刷新显示 paint,但是BackgroundWorker本身就是一个新线程,他本身是不会妨碍主界面刷新的 --------------------编程问答-------------------- 可以设置进度条的最大值为1000 --------------------编程问答-------------------- 我只是来围观一下!! --------------------编程问答-------------------- 1年前的帖子?楼主会回来收尸吗? --------------------编程问答-------------------- 应该是视觉问题吧,不然你在程序中写个到999暂停的代码试试 --------------------编程问答-------------------- 这种坟有什么好挖的... --------------------编程问答-------------------- 主次搞错了,对才怪
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,