【问题标题】:Estimate loop time for progress bar估计进度条的循环时间
【发布时间】:2013-03-05 04:21:36
【问题描述】:

我目前在 C# 中使用循环来生成文件,但程序需要几秒钟才能真正做到这一点,我觉得程序用户会受益于一个更新的进度条,告诉他们循环通过了多远这样他们就可以估计循环何时结束并生成所有文件。

我想知道是否有一种方法可以计算完成循环所需的时间,或者使用循环更新进度条以显示循环剩余的进度。

这是我的循环。

String GeneratedLevelName;
int levelx = 0;
int levely = 0;

for (int i = 0; i < GmapLevelArea; i ++) {
  if (levelx >= (GmapWidth - 1)) {
    levelx = 0;
    levely ++;

    GeneratedLevelName = (GmapPrefix + "_" + levelx + "_" + levely + ".nw");
    File.Copy(ApplicationDirectory + TemplateFileName, GmapDirectory + GeneratedLevelName);
    GmapFile.AppendLine('"' + GeneratedLevelName + '"' + ",");
  } else {
    levelx ++;

    GeneratedLevelName = (GmapPrefix + "_" + levelx + "_" + levely + ".nw");
    File.Copy(ApplicationDirectory + TemplateFileName, GmapDirectory + GeneratedLevelName);
    GmapFile.Append('"' + GeneratedLevelName + '"' + ",");
  }
}

非常感谢任何帮助。

【问题讨论】:

  • 您必须手动计算的时间。当然有可能。您也可以只显示所取得的进展(例如每次迭代时触发事件)。如果每次迭代的时间或多或少相等,后者可能就足够了
  • 这实际上是一个很好的替代建议。不过,我会考虑手动计算时间。感谢您的帮助。
  • 如果你的文件足够大,并且你想获得一个真正的进度条来复制字节,看看这些问题:Can I show file copy progress using FileInfo.CopyTo() in .NET?File Copy with Progress Bar
  • 此链接无效:xkcd.com/612

标签: c# loops progress-bar


【解决方案1】:

这取决于您生成的文件的一致性(它们都需要一秒钟,还是比其他文件需要更长的时间?)以及您是否知道要生成多少。在最简单的情况下,您可以通过获取要生成的文件数来估计时间。例如,如果您创建 50 个文件,则可以在生成文件后将进度条增加 2%。

【讨论】:

  • 这些是我最初的想法。我可以使用常识并做出不错的估计,每次生成文件时都会增加进度条。不过,我能看到的唯一问题是,不同的计算机会发现生成文件更容易/更难,并且会以不同的速度完成。较慢的计算机可能需要一分钟,而较快的计算机可能需要几秒钟。
  • 这仍然不会改变您迭代的进度。如果生成 10 个文件,则在快速和慢速计算机上的百分比相同。唯一的区别是进度条增加的速度。仅当您想估计操作剩余的时间时,速度才重要,在这种情况下,您可以在这里查看:stackoverflow.com/questions/473355/calculate-time-remaining
【解决方案2】:

由于很难为 File.Copy 计时,我认为您应该只根据已处理的文件总数来确定进度条。

所以如果你有一个进度条:pb

pb.Minimum = 0;
pb.Maximum = GMapLevelArea;

然后将进度条的值设置为你的i值

pb.Value = i;

现在,当我通常使用这样的进度条时,我通常不会更新任何迭代。我通常在几次迭代后更新。

为此,我通常会检查迭代次数:

if(i % 10 == 0) //only true when i is a multiple of 10
 pb.Value = i;

然后在循环结束时,如果它不是您更新的倍数,您可以将进度条设置为最大值或将其重置为零以使其不完成。

pb.Value = GMapLevelArea; or pb.Value = 0;

【讨论】:

  • 这正是我想要的。您提供的解决方案现在看起来如此明显!非常感谢。
猜你喜欢
  • 2010-10-15
  • 2021-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多