Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi ProgressBar beim Kopieren von Dateien - Falsche Prozente (https://www.delphipraxis.net/95455-progressbar-beim-kopieren-von-dateien-falsche-prozente.html)

Mazel 6. Jul 2007 18:12


ProgressBar beim Kopieren von Dateien - Falsche Prozente
 
Hallo,

ich verwende in einem Programm beim Kopieren von Daten zwei ProgressBars. Die erste für die aktuelle Datei und die zweite für den gesamten Fortschritt. Das Kopieren stellt kein Problem dar, jedoch die Anzeige der zweiten ProgressBar. Für den Fortschritt der ersten ProgressBar verwende ich die Dateigröße, demnach weise ich PBr1.Max die Dateigröße zu. Da ich nun nicht nur eine Datei sondern größere Mengen kopieren will, kann ich die Gesamtgröße aller Dateien nicht für PBr2.Max verwenden da es den Integerbereich verlässt. Aus diesem Grund dachte ich, dass ich für die zweite die Prozente ausgebe. Demnach hat PBr2.Max immer 100. Leider schaffe ich es nicht, die Prozente so zu errechnen, dass die ProgressBar am Ende passt.
Delphi-Quellcode:
// PBrCopy = einzelne Datei
// PBrCopyAll = Gesamtfortschritt
// FullSize = Gesamtgröße aller Dateien
// nachdem Kopiervorgang für einzelne Datei beendet

// Codevariante 1 - Gesamtfortschritt zu früh am Ende
PBrCopy.Max := Trunc(0.5 + 100.0 * PBrCopy.Max / FullSize);
PBrCopyAll.Position := PBrCopyAll.Position + PBrCopy.Max;

// Codevariante 2 - Gesamtfortschritt zu früh am Ende, jedoch weniger früher
PBrCopy.Max := Round(PBrCopy.Max * 100 / FullSize);
PBrCopyAll.Position := PBrCopyAll.Position + PBrCopy.Max;

DeddyH 6. Jul 2007 18:21

Re: ProgressBar beim Kopieren von Daten - Falsche Prozente
 
Wieso gibst Du nicht als ProgressBar.Max die Anzahl der Dateien an und erhöhst nach jeder Datei die Position um 1?

Mazel 6. Jul 2007 18:27

Re: ProgressBar beim Kopieren von Daten - Falsche Prozente
 
Angenommen du kopierst 2 Dateien. Eine ist 130 MB und die andere ist 3,4 MB. Das würde bedeuten, dass nach dem 1. Kopieren die ProgressBar in der MItte ist, müsste aber datenmäßig ganz nah am Ende sitzen.

DeddyH 6. Jul 2007 18:32

Re: ProgressBar beim Kopieren von Dateien - Falsche Prozente
 
Naja, eine bessere Lösung fällt mir auch nicht ein. Außerdem macht Windows das ja auch nicht besser, wenn man sich die errechneten Zeiten beim Kopieren mit dem Explorer einmal ansieht (ich hatte schon eine errechnete Zeit von ca. 120 Jahren Restdauer). :mrgreen:

Mazel 6. Jul 2007 18:40

Re: ProgressBar beim Kopieren von Dateien - Falsche Prozente
 
Wenn sich keine andere Lösung findet, werde ich das wohl so machen wie du vorgeschlagen hast, da die meisten Dateien die ich kopiere nicht so große Schwankungen unterliegen und die Anzahl der zu kopierenden Dateien meist auch größer als 30 ist. Aber eine schönere Lösung wär mir lieber ;).

scrat1979 6. Jul 2007 18:58

Re: ProgressBar beim Kopieren von Dateien - Falsche Prozente
 
Hallo!

Solltest Du die Dateien mit ReadBuffer / WriteBuffer kopieren, dann errechne am Anfang die Gesamtgröße aller Dateien (machst Du wahrscheinlich ja schon).
Vor dem kopieren einer neuen Dateien PBCopy.Max auf Dateigröße setzen, nach jedem Schleifendurchlauf die Größe der tatsächlich [Am Ende wird ja meistens ein kleinerer Wert geschrieben] geschriebenen Datenmenge auf PBCopy.Position dazuaddieren. Bei der nächsten Datei Position wieder auf 0 setzen und von vorne beginnen...

Bei der PBCopyAll einfach als Max-Wert die Gesamtgröße aller Dateien festsetzen und weiter wie oben (Natürlich ohne bei der nächsten Datei die Position zurückzusetzen). Die ProgressBars unterscheiden sich also dann lediglich beim Maximum. Damit würden dann auch Deine Berechnungen wegfallen... Hab ich auch schon öfters so gemacht, funktioniert bei mir einwandfrei!

SCRaT

Mazel 6. Jul 2007 19:03

Re: ProgressBar beim Kopieren von Dateien - Falsche Prozente
 
Das funktioniert vieleicht bei kleinen Datenmengen nicht aber bei Dateien mit einer Gesamtgröße von mehreren 100 MB. Um eine genaue Fortschrittsanzeige zu haben würde ich die Byte zur Berechnung nutzen und das würde weit den Integerbereich verlassen

scrat1979 6. Jul 2007 19:09

Re: ProgressBar beim Kopieren von Dateien - Falsche Prozente
 
Zitat:

Zitat von Mazel
Das funktioniert vieleicht bei kleinen Datenmengen nicht aber bei Dateien mit einer Gesamtgröße von mehreren 100 MB. Um eine genaue Fortschrittsanzeige zu haben würde ich die Byte zur Berechnung nutzen und das würde weit den Integerbereich verlassen

Hmmm, ok. Daran hatte ich nicht gedacht. Wurde ein Int64 (Wertebereich -9223372036854775808 bis +9223372036854775807 denn auch nicht reichen?!? Sonst könntest Du ja auch mit kBytes rechnen, spart Dir 3 Stellen und wäre noch genau genug, oder? :-)

SCRaT

//EDIT: Wertebereich INT64 eingefügt.

Mazel 6. Jul 2007 19:23

Re: ProgressBar beim Kopieren von Dateien - Falsche Prozente
 
Doch Int64 reicht für meine Bedürfnisse für eine einzelne Datei und zum Errechnen der Gesamtgröße aus aber ProgressBar.Max ist leider nur Integer.

Aber als ich vorhin den Text geschrieben habe, viel mir auch ein ich, dass ich das in KByte umrechnen könnte.

Mazel 7. Jul 2007 09:14

Re: ProgressBar beim Kopieren von Dateien - Falsche Prozente
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich glaube ich habe das Problem gefunden. Es scheint als ob meine Kopierrountine einen Fehler tätigt. Ich habe probeweise alle Dateigrößen, die übertragen wurden in einer ListBox eingeschrieben. Das unfassbare war, dass ich nicht wie ich dachte 25 Dateien sondern 28 Dateien kopiert haben, zumindest virtuell. Kopiert wurden aber wirklich nur 25, aber in der Liste stehen 28 Werte. Einige Werte sind nahezu identisch und unterscheiden sich blos um ein paar Byte. Was ich damit sagen will ist, dass die folgende Routine rigendwie doppelte Werte aufnimmt.
Delphi-Quellcode:
function CopyFileProgress(TotalFileSize, TotalBytesTransferred, StreamSize, StreamBytesTransferred: LARGE_INTEGER; dwStreamNumber, dwCallbackReason, hSourceFile, hDestinationFile, lpData: DWORD): DWORD; stdcall;
begin
 Application.ProcessMessages;
 if Main.bCopyCanceled = True then
 begin
  Result := PROGRESS_CANCEL;
  Exit;
 end;
 case dwCallbackReason of
  CALLBACK_CHUNK_FINISHED:
   begin
    Progress.PBrCopy.Position := TotalBytesTransferred.QuadPart;
    Result := PROGRESS_CONTINUE;
   end;
  CALLBACK_STREAM_SWITCH:
   begin
    Progress.PBrCopyAll.Position := Progress.PBrCopyAll.Position + Progress.PBrCopy.Position;
    Progress.ListBox1.Items.Add(inttostr(Progress.PBrCopy.Position));
    Progress.PBrCopy.Max := TotalFileSize.QuadPart;
    Result := PROGRESS_CONTINUE;
   end;
 end;
end;
Wie kann das sein? Dazu ein Bild im Anhang.

[Edit]
Ich habe dazu mal ein anderen Beitrag eröffnet, da es meiner Meinung nach nicht hier her passt.
CopyFileProgress mit Fehler
[/Edit]


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:40 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz