C#提高文件处理的Progressbar准确性
在我的代码中,我正在处理大量的文件,并试图在我的应用程序中实现更精确的进度显示。由于文件大小差异很大(1-250MB),因此处理时间也不尽相同,因此仅使用已处理文件的计数器并不能准确表示进度C#提高文件处理的Progressbar准确性,c#,progress-bar,C#,Progress Bar,在我的代码中,我正在处理大量的文件,并试图在我的应用程序中实现更精确的进度显示。由于文件大小差异很大(1-250MB),因此处理时间也不尽相同,因此仅使用已处理文件的计数器并不能准确表示进度 progress?.Report((i+1) * 100 / total); 相反,我用这种方法研究了文件大小的分解: progress?.Report(pb.Value + (int)(update.Size * 100 / totalSize)); 但是,完成后,progressbar未满,我认为这
progress?.Report((i+1) * 100 / total);
相反,我用这种方法研究了文件大小的分解:
progress?.Report(pb.Value + (int)(update.Size * 100 / totalSize));
但是,完成后,progressbar未满,我认为这是由于分区中的精度损失
我的totalSize变量可以超过2147483647字节,因此我不能只将progressbar最大值设置为total size,然后按文件大小递增该值
有没有一个简单的方法可以做到这一点?我能想到的唯一方法是在完成最后一个元素后将progressbar值设置为100%,但如果可能的话,我希望避免这样做。谢谢在您当前的设计中,可以改进的地方很少,以提高精度: 我的totalSize变量可以超过2147483647字节,因此我不能只将progressbar最大值设置为total size,然后按文件大小递增该值
long
数据类型而不是int
。这样,您就可以存储数据的实际大小。进度条本身不需要如此精确,但是:
progress?.Report(pb.Value + (int)(update.Size * 100 / totalSize)); //note 100
进度来提高进度条的准确性。最大值更高(例如,progress.Maximum=1000
,然后每个progress.Value
计算为总进度的0.1%),这将使您的精度比默认进度条设置高10倍,前提是您的GUI支持这种像素精度
Thread.Sleep
99/100
。为了避免这种情况,我建议在progress.Value=N中的最终表示之前,使用double
而不是整数类型来处理数据代码>分配发生。你也可以考虑使用<代码>数学。循环< /代码>如果<代码>双< /代码>精度仍然会给你非常小的错误。这里最重要的是进行良好的调试以找出原因,然后我们可以应用适当的修复
在您当前的设计中,可以改进的地方很少,以提高精度: 我的totalSize变量可以超过2147483647字节,因此我不能只将progressbar最大值设置为total size,然后按文件大小递增该值
long
数据类型而不是int
。这样,您就可以存储数据的实际大小。进度条本身不需要如此精确,但是:
progress?.Report(pb.Value + (int)(update.Size * 100 / totalSize)); //note 100
进度来提高进度条的准确性。最大值更高(例如,progress.Maximum=1000
,然后每个progress.Value
计算为总进度的0.1%),这将使您的精度比默认进度条设置高10倍,前提是您的GUI支持这种像素精度
Thread.Sleep
99/100
。为了避免这种情况,我建议在progress.Value=N中的最终表示之前,使用double
而不是整数类型来处理数据代码>分配发生。你也可以考虑使用<代码>数学。循环< /代码>如果<代码>双< /代码>精度仍然会给你非常小的错误。这里最重要的是进行良好的调试以找出原因,然后我们可以应用适当的修复
你认为你能给我们看处理文件的代码吗?你认为你能给我们看处理文件的代码吗?伊恩,我真的很抱歉,我花了这么长时间才回复你。我不记得收到过你回复的通知。非常感谢您的回复,您提出了一些非常好的建议。我目前手头没有该源代码,但我会在可能的时候尝试一下。@tom982很高兴它能帮上忙!;)没问题。伊恩,我真的很抱歉花了这么长时间才回复你。我不记得收到过你回复的通知。非常感谢您的回复,您提出了一些非常好的建议。我目前手头没有该源代码,但我会在可能的时候尝试一下。@tom982很高兴它能帮上忙!;)没问题。