Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   FTP Indy Komponente, Event OnWork und der Parameter AWorkCount (https://www.delphipraxis.net/194150-ftp-indy-komponente-event-onwork-und-der-parameter-aworkcount.html)

daniel775 22. Okt 2017 20:57

FTP Indy Komponente, Event OnWork und der Parameter AWorkCount
 
Guten Abend,


bin gerade dabei in mein Updatemodul eine Dateiübertragung per FTP bzw. HTTP Protokoll zu integrieren. Irgendwie will mir das Feature mit der Progressbar nicht gelingen.
Genau genommen gibt es zwei Progressbars. Eine für die einzelne Datei die gerade übertragen wird und eine für den Gesamtfortschritt.
Eigentlich ist das was ich nicht hinbekomme ja ein Schönheitsfehler. Meine Progressbar für die Dateien bleibt nach der Übertragung bei 99% stehen und meine Progressbar für den Gesamtfortschritt bei 96%.

Es werden zum Test 5 Dateien per FTP Protokoll vom FTP zu dem meinen Rechner übertragen. Der FTP-Server sitzt im lokalen Netz. Die Dateien haben folgende Größen in Byte:

1.874.053.550
62.230.016
62.634
22.458
1
Summe: 1.936.368.659 Bytes

Um dem ganzen auf die Schliche zu kommen habe ich eine Feldvariable ausserhalb der Prozedur die FBytesLast heisst. Am Ende der IdFTPWork Prozedur speichere ich den aktuellen AWorkCount Stand in diese Variable FBytesLast. Am Anfang der Prozedur werte ich diesen Stand aus mit:

Code:
FLastBytes := (AWorkCount - FLastBytes);
if FShowCnt < 400 then
    memo.Lines.Add(FormatFloat('#,##0', FLastBytes));
Mit den nächsten 400 aufrufen der IdFTPWork Prozedur werden diese übertragenen Bytes in ein Memo geschrieben.

Code:
58
360
4.294.966.992
4.294.967.250
58
360
32.350
29.866
4.294.927.120
4.294.944.839
113
32.654
32.768
32.768
32.768
32.768
32.768
Mit einer der ersten Aufrufe werden 58 Bytes dann 360 Bytes übertragen und irgenwann im Laufe der Übertragungen Konstant 32 Kilobyte. Und jetzt zu meiner Frage die mir warscheinlich die letzten 4% zu den 100% in der Progressbar für den Gesamtfortschritt versauen. Was haben diese Werte in AWorkCount zu suchen? 4.294.966.992, 4.294.967.250, 4.294.927.120, 4.294.944.839

Falls sich jetzt einige Fragen, warum ich nicht in der OnBegin Ereignisprozedur den Wert aus dem Parameter AWorkCountMax übernehme. Weil der Parameter AWorkCountMax leider nur beim Upload > 0 ist. Beim Download muss man umständlich Rekusiv durch die Ordnerstrukturen um mit der Prozedur Size die zu übertragenen Bytes zu ermitteln. Lass mich aber gern eines besseren belehren. Wenn jemand einen Vorschlag hat das zu vereinfachen.

daniel775 22. Okt 2017 21:54

AW: FTP Indy Komponente, Event OnWork und der Parameter AWorkCount
 
Hat das irgendetwas mit der maximalen Adressierung von meiner FLastBytes Variable (Datentyp Cardinal, 4.294.967.296 Bytes sprich 4 GB) zutun? Wenn ich 4.294.966.992 von 4.294.967.296 Bytes abziehe ist die Differenz 304 Bytes!?!?


Edit:

Ich habe gerade mal den Datentyp von Cardinal auf Integer geändert. Das ist das Ergebnis:


58
360
-304
-46
58
360
32.350
29.866
-40.176
-22.457
113
32.654
32.768
32.768

Die Differenzen beim Datentyp Cardinal drücken sich beim Datentyp Integer ins Negative aus. Den Grund dafür kann ich mir erklären, Cardinal kennt kein unsigned. Aber das erklärt noch immer nicht, warum die Werte überhaupt ins Negative gehen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:33 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