Laden...

Fragen zur ProgressBar bzw. Progress-Formeln

Erstellt von -acid- vor 18 Jahren Letzter Beitrag vor 18 Jahren 1.746 Views
-
-acid- Themenstarter:in
885 Beiträge seit 2004
vor 18 Jahren
Fragen zur ProgressBar bzw. Progress-Formeln

Hi Leute.

Bei meiner Komponente (Dialog), die ein Verzeichnis kopieren kann, bin ich auf zwei Probleme gestoßen:

  1. Beim kopieren der Dateien und Unterordner wird eine rekursive Methode aufgerufen. Diese Methode zählt vorher die Anzahl der Dateien und setzt das als Maximum der Progressbar. Bei jedem Aufruf der Methode wird dann zusätzlich der Value von der Progressbar um 1 erhöht.

Dabei ist mir aufgefallen, dass wenn ich zb. die D2 LOD CD kopiere, viele kleine Dateien und eine große Datei dabei ist. Die Anzeige fängt also an, läuft drei Balken, dann schießt sie plötzlich bis zum Ende durch. Windows macht das aber "gleichmäßiger" sodass sauber/konstant immer ein Balken erhöht wird. Wie bekomme ich eine Gleichmäßigkeit in den Verlauf der Progressbar? Was muss ich an meinem Vorgehen ändern?

Ich hoffe ihr habt mein Problem 1 verstanden.

  1. Ich möchte in meinem Dialog gerne die Restzeit anzeigen (wie im WindowsDialog). Wie muss ich dabei vorgehen? Die Anzahl der Gesamtbytes habe ich bereits, das ist bestimmt ein Teil der Formel....
S
186 Beiträge seit 2005
vor 18 Jahren
  1. Wie wär's wenn du bei deiner Progressbar die Dateigrößen alle zusammenrechnest und das dann so regelst? Das dürfte dann ja relativ gut hinkommen.

  2. Das mit den Zeitanzeigen stimmt doch bei solchen Tools eh nie. Aber vielleicht kannst du messen, wie lang er für die ersten paar bytes braucht und dann auf den Rest schließen, also multiplizieren. Weiß nicht ob's da noch ne elegantere Lösung gibt. Denke aber so wär das am einfachsten.

-
-acid- Themenstarter:in
885 Beiträge seit 2004
vor 18 Jahren

zu 2) Also wenn ich im Windows was kopiere, korrigiert er die Zeit immer und die passt dann auch! Von daher stimmt die Zeit. So will ich das.

Generell habe ich aber keine Ahnung wie das mit Formel bzw der Vorgehensweise aussieht.

S
186 Beiträge seit 2005
vor 18 Jahren

Klar stimmt die dann zum Schluß immer. Aber während man kopiert wird die eben wie du sagst immer wieder korrigiert. Hängt wahrscheinlich damit zusammen, dass der Prozessor oder die Festplatte oder das Netzwerk ... immer unterschiedlich ausgelastet sind. Aber ich denke die berechnen das auch irgendwie über die Dateigröße.
So würd ich's zumindest machen.
Am besten du schickst erst ne kleine Datei los und misst die Zeit, die sie braucht. Dann kannste das ergebnis ja auf 1KB oder so umrechnen und die gesamtdauer berechnen. Zwischendurch kannste ja immer wieder mal neu berechnen.
Irgendwie so eben...

-
-acid- Themenstarter:in
885 Beiträge seit 2004
vor 18 Jahren

Job. so denke ich auch.

Wie schon mehrmals bin ich nicht so der Mathmatiker unter den Programmierern g und wäre daher über ne Art "Formelstruktur" dankbar.

S
186 Beiträge seit 2005
vor 18 Jahren

Irgendwie sowas:
Zeit = (gemesseneZeitspanneFürErsteDatei / GrößeErsteDateiInKB) * GesamtGrößeAllerDateienInKB
????
und dann kannste's ja ab und zu nochmal neu messen und neu berechnen. Aber dann nicht mehr mit GesamtGrößeAllerDateien sondern nur mit der der restlichen.

Wenn's irgendwie ne möglichkeit gibt die übertragenen Bytes oder KB noch während des Kopiervorgangs einer Datei zu messen wäre das natürlich noch eleganter, da du dir nicht ne kleine Datei für den Anfang suchen musst.

D
462 Beiträge seit 2005
vor 18 Jahren

Hallo!

Du könntest die Files mittels Streams oder ähnlichem in z.B. 1KB-Blöcken übertragen und nach jedem Block deine ProgressBar entsprechend updaten.

Mit einem Timer könntest du dann ermitteln, wieviele Blöcke pro Sekunde übertragen werden und das dann auf die noch zu übermittelnde Blockanzahl hochrechnen.

mfg

S
186 Beiträge seit 2005
vor 18 Jahren

Auch ne gute Idee.

3.825 Beiträge seit 2006
vor 18 Jahren

Restzeit anzeigen :

Aus der bisher übertragen Datenmenge und der bisher verbrauchten Zeit den Zeitbedarf errechnen. Das ist einfacher Dreisatz. Das Ergebnis wird dann zum Ende hin immer genauer.

(wie im WindowsDialog)

Bist Du sicher ? In Windows stimmen die Zeitangaben nie !

😉

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

2.082 Beiträge seit 2005
vor 18 Jahren

Verbleibende Zeit ausrechnen is leicht:

(Zeit bisher / Daten bisher) * Daten Gesamt = Zeit gesamt.

// Edit:

Zu 1) Entweder du machst einen eigenenen CopyVorgang oder du machst folgendes:

Für jede datei:
Datengesamt += datei.größe

Wenn eine Datei fertig kopiert wurde, Datenbisjetzt += Größederdatei

Es ist toll jemand zu sein, der nichts von der persönlichen Meinung Anderer hält. - frisch-live.de