2012-09-16 13 views
6

Ich habe eine große text file enthält viele Zeilen von Daten. In meiner Anwendung öffne ich diese Datei, lese jede Zeile nach einem regulären Ausdruck und zeige sie in einer Datagridview an. Die Gesamtzahl der erzeugten Zeilen beträgt etwa 2000 (Manchmal sogar mehr, so ziemlich riesig).Fortschrittsbalken und Datei laden

Also für alle diese Operationen dauert es ziemlich viel Zeit. Also habe ich diesen Code mit Hintergrundarbeiter in einen anderen Thread verschoben, und alles ist in Ordnung, außer dass ich den Ladezustand in einer Fortschrittsleiste anzeigen möchte, in der ich versage.

Ich habe FileInfo Klasse verwendet, um die Dateilänge zu erhalten und gab dann diesen Wert an die Progressbar.Maximum. Scheint nicht der richtige Ansatz, weil eine Testdatei, die "3" Zeilen enthält, eine Dateilänge von "305" zurückgegeben hat. Ich verstehe nicht, wie viel Schritt Intervall ich auf diese Weise geben sollte.

Codebeispiel:

FileInfo ff = new FileInfo(openFileDialog1.FileName); 
int fsize= Convert.ToInt32(ff.Length); 
int val=1; 
pgbar_load.Invoke(new MethodInvoker(delegate { pgbar_load.Maximum = fsize; })); 

und in der Schleife:

++val; 
wk.ReportProgress(val); 

und dann:

private void bgwrkr_load_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
    pgbar_load.Value = e.ProgressPercentage; 
} 

Also zwei Dinge, die ich bin auf der Suche nach:

  1. Einstellung des Maximalwerts für die Fortschrittsanzeige.
  2. Schritt-Index richtig einstellen.

Bitte schlagen Sie mir einen Weg vor, weiterzugehen.

Antwort

6

Keep Progressbar.Maximum bei 100. Dann verfolgen Sie Ihre gelesenen Daten in einer int-Variable. Führen Sie eine Schleife auf dem UI-Thread aus (dazu können Sie den Timer verwenden), der den Wert des Fortschrittsbalkens durch Überprüfung der gelesenen Bytes festlegt. Z.B. Angenommen, Sie speichern Ihre gelesenen Bytes in int totalRead; und int totalFileSize enthält die Größe Ihrer Datei.

myProgressBar.Value = Convert.ToInt32(Math.Ceil(100d * totalRead/totalFileSize)); 

Sie können dies in Ihrem Timer-Tick-Event-Handler setzen. Dadurch wird der Fortschrittsbalken schrittweise auf 100% gesetzt. Wenn das Lesen der Datei abgeschlossen ist, deaktivieren Sie den Timer.

+0

Wie kann ich die gesamten gelesenen Bytes jedes Mal lesen, ich meine den int totalRead Wert? Die Sache ist zunächst, ich lese alle Dateien und speichern Sie die Daten in einer generischen Liste. Und dann in einer Schleife aktualisiere ich jede Zeile des Datagrids, wo ich den Fortschritt zeige. – Cdeez

+0

Sie können den hinzugefügten Code in der Frage sehen, was ich tue. – Cdeez

+0

Wenige Änderungen an dieser Antwort werden das Ergebnis geben --- Die 'totalRead' und' totalFilesize' sollten 'double' Werte sein, da, wenn sie Ganzzahlen sind, das Ergebnis immer eine Null ist (eine Typumwandlung des Ergebnisses in eine ganze Zahl)) und 100d * 0 = 0. Und seine 'Math.Ceiling();' – Cdeez

Verwandte Themen