估计进度条的循环时间

时间:2013-03-16 12:59:37

标签: c# loops progress-bar

我目前正在使用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 + '"' + ",");
  }
}

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

由于很难对File.Copy进行计时,我认为你应该只根据工作的总文件来建立进度条。

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

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

然后将进度条的值设置为您的值

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;

答案 1 :(得分:0)

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