Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   JEDI JCL Compression OnProgress wie verwenden (https://www.delphipraxis.net/193906-jedi-jcl-compression-onprogress-wie-verwenden.html)

Glados 21. Sep 2017 20:42


JEDI JCL Compression OnProgress wie verwenden
 
Ich frage mich schon seit einer Ewigkeit wie man von den JEDI JCL-Komponenten einen richtig funktionierenden OnProgress-Event implementiert.
Mein Ziel ist ein Event bei welchem ich grob gesagt gucken kann, welche Datei gerade komprimiert wird und wenn der Vorgang fertig ist möchte ich das in einem Log festhalten.

Das Event hat folgende Kopfzeile
Delphi-Quellcode:

(Sender: TObject; const Value, MaxValue: Int64);

Wie verwendet man den Event richtig? Was muss ich mit Value und MaxValue machen, damit ich korrekt abfragen kann, wann eine Datei fertig komprimiert wurde? Ich bin leider eine
regelrechte Niete was Mathematik angeht und sehe hier nur chinesische Zeichen und einen Berg von Problemen vor mir.

Glados 22. Sep 2017 11:43

AW: JEDI JCL Compression OnProgress wie verwenden
 
Darf man hier Beiträge wieder nach oben holen? Wenn nicht, bitte löschen :oops:

nahpets 22. Sep 2017 12:08

AW: JEDI JCL Compression OnProgress wie verwenden
 
Hab' die Teil noch nie benutzt.

Was steht denn in Value? MaxValue dürfte ja quasi das Ende sein.

Also mal 'ne Progressbar nehmen. Minimum auf 0, Maximum auf MaxValue und Position auf Value.
Tippe mal darauf, dass man damit (ohne Mathematik) 'nen Fortschrittsbalken bekommt, an dem man sehen kann, wieviel erledigt wurde und wieviel noch fehlt.

Je nach Typ der Progressbar, zeigt sie von alleine die Prozentangabe des Fortschrittes an.

Ansonsten Kettensatz oder Dreisatz:

?% = Value
MaxValue = 100%

Entspricht: ? = Value * 100 / MaxValue

Auf 'nem Label also:
Delphi-Quellcode:
Label.Caption := Format('%d von %d (%3.2f%%) erledigt.',[Value, MaxValue, Value * 100.00 / MaxValue]

Glados 22. Sep 2017 12:16

AW: JEDI JCL Compression OnProgress wie verwenden
 
Es geht mir nicht um die ProgressBar sondern viel mehr darum herauszufinden, wann eine Datei fertig verarbeitet wurde.

Value enthält soweit ich verstanden habe die Größe in Bytes der Daten, die schon verarbeitet wurden. MaxValue die Gesamtgröße.
Die Dateigröße jeder einzelnen Datei liegt mir vor und ich kann sie abfragen. Jetzt muss ich nur wissen wie ich mit Value und MaxValue + eventuellen ZwischenVariablen wie "OldValue" errechne, wann eine Datei fertig komprimiert wurde.

Beispiel
165 - 15 = 150
Value - Dateigröße = OldValue

Klingt einfach, funktioniert aber nicht.

jaenicke 22. Sep 2017 12:43

AW: JEDI JCL Compression OnProgress wie verwenden
 
Der Vergleich Value = MaxValue sollte schon reichen. Ob die Datei dann aber auch schon wieder geschlossen ist, ist daraus nicht klar. Es kann also sein, dass die Komprimierung fertig ist, die Zieldatei aber noch gesperrt ist.

Glados 22. Sep 2017 12:44

AW: JEDI JCL Compression OnProgress wie verwenden
 
MaxValue enthält aber die Größe in Bytes aller zu komprimierenden Dateien.

nahpets 22. Sep 2017 12:54

AW: JEDI JCL Compression OnProgress wie verwenden
 
Wenn in Value steht, wieviel Byte komprimiert wurden und MaxValue wieviel insgesamt zu komprimieren sind, sich aber beide Werte auf die Gesamtmenge und nicht die einzelne Datei beziehen, dann geht das einfach nicht.

Wenn Du weißt, in welcher Reihenfolge die Dateien komprimiert werden und Du die Größe der einzelnen Dateien weißt, dann kannst Du jeweils ausrechnen, welche Datei gerade "In Mache ist".

Sinngemäß sowas in der Art:
Delphi-Quellcode:
Summe := 0;
for i := 0 to Dateiliste.Count - 1 do begin
  Summe := Summe + Dateiliste[i].Dateigroesse;
  if Summe > Value then begin
    Label1.Caption := Format('zuletzt komprimierte Datei: %s (%d Byte)',[Dateiliste[i - 1].Dateiname,Dateiliste[i - 1].Dateigroesse]);
    Label2.Caption := Format('aktuell wird die Datei %s (%d Byte) komprimiert ...',[Dateiliste[i].Dateiname,Dateiliste[i].Dateigroesse]);
    break;
  end;
end;
Ob das performant und sinnvoll ist, sei erstmal dahingestellt.

Glados 22. Sep 2017 13:02

AW: JEDI JCL Compression OnProgress wie verwenden
 
Zitat:

Wenn Du weißt, in welcher Reihenfolge die Dateien komprimiert werden und Du die Größe der einzelnen Dateien weißt, dann kannst Du jeweils ausrechnen, welche Datei gerade "In Mache ist".
Beides weiß ich.

Ich verstehe langsam nichts mehr.
Ein Testverzeichnis enthält 1800 Dateien. Alle 1800 werden komprimiert aber nur rund 600-700 (manchmal so manchmal so) werden vom obigen Code sowie von meinem erfasst.
In meiner Test-logdatei sind zu gefühlt 99% nur Dateien bis 50KB. Eine einzige Datei von 20MB wurde erfasst, der Rest > 50KB etwa nicht.

So wie es aussieht ist das JCLCompression OnProgress-Event einfach schlecht umgesetzt.

nahpets 22. Sep 2017 13:11

AW: JEDI JCL Compression OnProgress wie verwenden
 
Protokolliere doch in dem Ereignis einfach mal nur Value und schaue, wie sich der Wert verändert.

Eventuell wird er ja nicht dateiabhängig aufgerufen, sondern mengenabhängig oder alle x% der Gesamtmenge oder alle y Byte. Dann muss das Ereignis nicht bei jeder Datei aufgerufen werden.

[EDIT]
Wenn man in die Sourcen schaut, kann man erkennen / erahnen, dass der Aufruf dieses Ereignisses von der zur Komprimierung genutzten packervariante abhängig ist. Die Häufigkeit des Aufrufes könnte also bei ZIP-Dateien vollkommen anders sein, als bei 7z ...

Glados 22. Sep 2017 13:18

AW: JEDI JCL Compression OnProgress wie verwenden
 
Zitat:

Protokolliere doch in dem Ereignis einfach mal nur Value und schaue, wie sich der Wert verändert.
Alles schon xfach durch :stupid:

Value geht so lange hoch bis es MaxValue erreicht und dann ist der Vorgang beendet.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:00 Uhr.
Seite 1 von 2  1 2      

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