Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi idftp.onwork wird nicht aufgerufen (Indy 9) (https://www.delphipraxis.net/97248-idftp-onwork-wird-nicht-aufgerufen-indy-9-a.html)

iGoA 7. Aug 2007 15:46


idftp.onwork wird nicht aufgerufen (Indy 9)
 
Moin!

Ich habe das Problem, dass beim Upload einer Datei auf den FTP-Server das OnWork-Ereignis nie aufgerufen wird. Ich habe schon die Suchfunktion bemüht, aber nur ein ähnliches Problem mit Bezug auf Indy 9 auf 10 -Umstellung gefunden. Ich benutze aber nur die 9er.
Weiß jemand Rat?

Der verwendete Code sieht vom Prinzip her aus, wie in jedem anderen Beispiel, welches ich hier schon gefunden habe:
Delphi-Quellcode:
procedure TfrmFTPAction.idftpWork(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCount: Integer);
begin
  lblProgress.caption := inttostr(AWorkCount div 1024) +'KB / '+ inttostr(totalbytes div 1024)+'KB';
  application.processmessages;
end;

procedure TfrmFTPAction.idftpWorkBegin(Sender: TObject;
  AWorkMode: TWorkMode; const AWorkCountMax: Integer);
begin
  totalbytes := AWorkCountMax;
  lblProgress.caption := '0 / '+ inttostr(totalbytes)+'KB';;
  application.processmessages;
end;

SirThornberry 7. Aug 2007 15:51

Re: idftp.onwork wird nicht aufgerufen (Indy 9)
 
naja, du könntest noch über den umweg gehen eine eigene Streamklasse abzuleiten und darin die bytes mit zu zählen.

iGoA 7. Aug 2007 15:54

Re: idftp.onwork wird nicht aufgerufen (Indy 9)
 
Cool, an so einen Workaround habe ich auch schon gedacht. Ich weiß nur gerade nicht wie. Bin noch Indy-N00b. *g*
Kannst Du auf die schnelle einen Tipp abgeben?

SirThornberry 7. Aug 2007 15:57

Re: idftp.onwork wird nicht aufgerufen (Indy 9)
 
hier wurde der ansatz mal umgesetzt (in diesem Beispiel zur Begrenzung der Downloadgeschwindigkeit)
http://www.delphipraxis.net/internal...=686352#686352

iGoA 7. Aug 2007 16:27

Re: idftp.onwork wird nicht aufgerufen (Indy 9)
 
Uiuiui, ich bekomms nicht hin. Ich habe nun eine Klasse von TFileStream abgeleitet und die read-methode vererbt. Dort steht bisher nur
Delphi-Quellcode:
function TSpecialFileStream.Read(var Buffer; Count: Integer): Longint;
begin
  inherited read(buffer,count);
end;
weil ich das erstmal testen wollte.
Das löst eine Schutzverletzung aus. Was mach ich denn nun falsch?
Wenn ich die Methode nicht vererbe, also einfach nur ne leere Klasse von TFileStream ableite, funktioniert es.


btw: Nee alternative Lösung wäre mir natürlich auch lieb.

iGoA 7. Aug 2007 16:33

Re: idftp.onwork wird nicht aufgerufen (Indy 9)
 
MÖÖÖK! Hat sich erledigt. Hatte das "result :=" vergessen.
Forsche nun weiter...


Vielen Dank übrigens schonmal!

iGoA 8. Aug 2007 09:37

Re: idftp.onwork wird nicht aufgerufen (Indy 9)
 
Wollte vermerken, dass mit dieser Lösung alles klappt. Habe in der Read-Methode meiner eigenen Filestream-Klasse einen Bytecounter mitlaufen lassen und kann so die Fortschrittsanzeige implementieren.

Vielen Dank!

iGoA 8. Aug 2007 09:50

Re: idftp.onwork wird nicht aufgerufen (Indy 9)
 
Entschuldigung, wenn ich hier so rumspamme, aber ich musste feststellen, dass es doch noch nicht so gut läuft:
Dadurch, dass wir hier eine megaschnelle Verbindung zum Server haben, habe ich nicht bemerkt, daß die Fortschrittsanzeige sich scheinbar nur auf das Einlesen der Datei beschränkt, also nicht wirklich den Upload-Fortschritt anzeigt. Er rasselt nämlich anfangs einmal schnell die Zahlen hoch und lädt dann erst zum Server hoch.

Also die Frage bleibt leider doch aktuell:
Wie bekomme ich das OnWork-Event zum Laufen bzw. welchen Workaround für ne Fortschrittsanzeige gibt es?

SirThornberry 8. Aug 2007 10:07

Re: idftp.onwork wird nicht aufgerufen (Indy 9)
 
eigentlich sollte es so implementiert sein das schrittweise gelesen und übertragen wird. (also nicht erst der gesamte Stream gelesen und danach erst übertragen wird). Wenn dem nicht so wäre würde die Festplatte erstmal mächtig rasseln wenn man versucht eine mehrere GB große Datei hochzuladen (und dem ist nicht so).

Das kann man besonders gut beobachten wenn man den Destructor überschreibt und da einen Haltepunkt setzt. Der Stream wird dann auch erst nach Abschluss der Übertragung frei gegeben.

iGoA 8. Aug 2007 10:15

Re: idftp.onwork wird nicht aufgerufen (Indy 9)
 
Hier sieht´s aber definitiv danach aus: Festplatte rödelt fix und die KBytes zählen viel zu schnell hoch. Dateigröße aufm Server bleibt die ganze Zeit 0. Bis er mit dem Einlesen durch ist. Dann steigt die Größe aufm Server erst.

iGoA 8. Aug 2007 10:47

Re: idftp.onwork wird nicht aufgerufen (Indy 9)
 
Habe im Netz folgendes gefunden:
Zitat:

When was the last time you updated your version of Indy?
The snapshot has been labeled as "10.1.5" for a long time.
My guess is that you are still using an older snapshot
that had a buggy implementation of the TIdIOHandler.Write
(TIdStream) method. In some older snapshot releases, the
Write(TIdStream) method used write buffering, which caused
all sorts of problems in several components. One of the
side-effects being that the OnWork event can be ignored
since the data is not actually written to the connection
until after Write(TIdStream) has triggered the OnWorkEnd
event.
That buffering has already been removed awhile ago. Please
make sure that you are using the absolute latest snapshot.
Probiere gerade auf Indy 10 zu gehen. Hoffentlich löst das mein Problem.


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