2013-03-16 66 views
0

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

任何帮助,非常感谢。

+1

您必须手动计算的时间。这当然是可能的。你也可以显示所取得的进展(就像每次迭代所做的火灾事件)。如果每次迭代的时间大致相等,后者可能就足够了。 – bas 2013-03-16 13:07:05

+0

这是一个很好的替代建议。我会考虑手动计算时间。谢谢你的帮助。 – 2013-03-16 13:10:11

+0

如果你的文件足够大,你想获得一个真正的进度条来复制字节,请看下面这些问题:[我可以在.NET中使用FileInfo.CopyTo()显示文件复制进度吗?](http:// stackoverflow.com/questions/187768/can-i-show-file-copy-progress-using-fileinfo-copyto-in-net)和[带进度条的文件复制](http://stackoverflow.com/questions/6044629/file-copy-with-progress-bar) – psubsee2003 2013-03-16 13:22:32

回答

0

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

+0

这些是我最初的想法。我可以使用常识并做出合理的估计,每次生成文件时都会增加进度栏。我可以看到的唯一问题是,不同的计算机会发现生成文件更容易/更难,并且会以不同的速度执行。较慢的计算机可能需要一分钟,而较快的计算机可能需要几秒钟的时间。 – 2013-03-16 13:12:18

+0

这仍然不会更改迭代的_progress_。如果生成10个文件,则在快速和慢速计算机上的百分比是相同的。唯一的区别是进度条增加的速度有多快。如果你想估计剩下的操作时间,速度就会很重要,在这种情况下,你可以看看这里:http://stackoverflow.com/questions/473355/calculate-time-remaining – Lennart 2013-03-16 13:20:34

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; 
+0

这正是我正在寻找。您提供的解决方案现在看起来非常明显!非常感谢你。 – 2013-03-16 13:22:15

+0

@AaronJY,如果它回答你的问题,请将此标记为接受的答案。谢谢! – 2013-03-16 13:48:13