Aaron Yarborough
Aaron Yarborough

Reputation: 136

Estimate loop time for progress bar

I'm currently using a loop in C# to generate files, but the program takes a few seconds to actually do this and I feel the program user would benefit from a progress bar that updates to tell them how far the loop is through so they can estimate when the loop is going to finish and all of their files are generated.

I was wondering if there was a way to calculate the time it's going to take a loop to complete or update a progress bar with the loop to show how much progress the loop has left.

Here's my loop.

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 + '"' + ",");
  }
}

Any help is greatly appreciated.

Upvotes: 0

Views: 1660

Answers (2)

Tim Felty
Tim Felty

Reputation: 152

Since it would be difficult to time the File.Copy, I think you should just base your progress bar on total files worked on.

So if you have a progress bar: pb

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

then set the value of the progress bar to you i value

pb.Value = i;

Now when I usually use progress bars like this, I usually don't update ever iteration. I usually update after a few iterations.

So to do that I usually check for the iteration count:

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

Then at the end of the loop, if it doesn't happen to be a multiple of your update, you can either set the progress bar to its maximum value or reset it to zero to let them no its done.

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

Upvotes: 1

Lennart
Lennart

Reputation: 10333

It depends on how consistent your files are generated (do they all take a second, or take some longer than others?) and if you know how many you are going to generate. In the easiest case, you can estimate the time by taking the number of files to generate. For example if you create 50 files, you can increment the progress bar by two percent after a file is generated.

Upvotes: 0

Related Questions