AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi ProgressBar beim Kopieren von Dateien - Falsche Prozente
Thema durchsuchen
Ansicht
Themen-Optionen

ProgressBar beim Kopieren von Dateien - Falsche Prozente

Ein Thema von Mazel · begonnen am 6. Jul 2007 · letzter Beitrag vom 7. Jul 2007
Antwort Antwort
Benutzerbild von Mazel
Mazel

Registriert seit: 11. Nov 2005
Ort: Leipzig
831 Beiträge
 
#1

ProgressBar beim Kopieren von Dateien - Falsche Prozente

  Alt 6. Jul 2007, 18:12
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;
Marcel Jänicke
www.mj-software.net
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: ProgressBar beim Kopieren von Daten - Falsche Prozente

  Alt 6. Jul 2007, 18:21
Wieso gibst Du nicht als ProgressBar.Max die Anzahl der Dateien an und erhöhst nach jeder Datei die Position um 1?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Mazel
Mazel

Registriert seit: 11. Nov 2005
Ort: Leipzig
831 Beiträge
 
#3

Re: ProgressBar beim Kopieren von Daten - Falsche Prozente

  Alt 6. Jul 2007, 18:27
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.
Marcel Jänicke
www.mj-software.net
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: ProgressBar beim Kopieren von Dateien - Falsche Prozente

  Alt 6. Jul 2007, 18:32
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).
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Mazel
Mazel

Registriert seit: 11. Nov 2005
Ort: Leipzig
831 Beiträge
 
#5

Re: ProgressBar beim Kopieren von Dateien - Falsche Prozente

  Alt 6. Jul 2007, 18:40
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 .
Marcel Jänicke
www.mj-software.net
  Mit Zitat antworten Zitat
Benutzerbild von scrat1979
scrat1979

Registriert seit: 12. Jan 2007
Ort: Sulzbach a.d. Murr
1.028 Beiträge
 
Delphi 10.4 Sydney
 
#6

Re: ProgressBar beim Kopieren von Dateien - Falsche Prozente

  Alt 6. Jul 2007, 18:58
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
Michael Kübler
  Mit Zitat antworten Zitat
Benutzerbild von Mazel
Mazel

Registriert seit: 11. Nov 2005
Ort: Leipzig
831 Beiträge
 
#7

Re: ProgressBar beim Kopieren von Dateien - Falsche Prozente

  Alt 6. Jul 2007, 19:03
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
Marcel Jänicke
www.mj-software.net
  Mit Zitat antworten Zitat
Benutzerbild von scrat1979
scrat1979

Registriert seit: 12. Jan 2007
Ort: Sulzbach a.d. Murr
1.028 Beiträge
 
Delphi 10.4 Sydney
 
#8

Re: ProgressBar beim Kopieren von Dateien - Falsche Prozente

  Alt 6. Jul 2007, 19:09
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.
Michael Kübler
  Mit Zitat antworten Zitat
Benutzerbild von Mazel
Mazel

Registriert seit: 11. Nov 2005
Ort: Leipzig
831 Beiträge
 
#9

Re: ProgressBar beim Kopieren von Dateien - Falsche Prozente

  Alt 6. Jul 2007, 19:23
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.
Marcel Jänicke
www.mj-software.net
  Mit Zitat antworten Zitat
Benutzerbild von Mazel
Mazel

Registriert seit: 11. Nov 2005
Ort: Leipzig
831 Beiträge
 
#10

Re: ProgressBar beim Kopieren von Dateien - Falsche Prozente

  Alt 7. Jul 2007, 09:14
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]
Miniaturansicht angehängter Grafiken
doppelter_wert_106.png  
Marcel Jänicke
www.mj-software.net
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:39 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz