2013-03-16 105 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