![]() |
Re: Indy 10 - Progressbar arbeitet nicht mehr mit OnWork
Naja, FOnWork steht da jedenfalls nicht drin. Schlecht.
|
Re: Indy 10 - Progressbar arbeitet nicht mehr mit OnWork
Muß auch nicht, ich denke das Event sollte in diesem Methodenaufruf
ausgelöst werden, bzw. OnWork gesetzt werden:
Delphi-Quellcode:
Grüße
FDataChannel.IOHandler.Write(ASource,0, false); // from beginning
Klaus |
Re: Indy 10 - Progressbar arbeitet nicht mehr mit OnWork
Hallo allerseits,
Ich habe in meiner Application im OnCreate Ereignis gleich folgendes gesetzt:
Delphi-Quellcode:
Das funktioniert auch soweit.
IdFTP1.IOHandler.Intercept := IdLogEvent1.Intercept;
IdFTP1.IOHandler.OnWork := IdFTP1.OnWork; IdFTP1.IOHandler.OnWorkBegin := IdFTP1.OnWorkBegin; IdFTP1.IOHandler.OnWorkEnd := IdFTP1.OnWorkEnd; IdFTP1.IOHandler.OnStatus := IdFTP1.OnStatus; Jetzt bin ich glaube ich einen Schritt weiter gekommen: Im QuellCode des IOHandlers habe ich gesehen, dass das DoWork nur beim WriteDirect gesetzt wird, nicht aber beim normalen Write(über Puffer). Ich habe im QuellCode mal probeweise das DoWork eingefügt und siehe da, der Fortschrittsbalken bewegt sich (allerdings arbeitet er hier die gesamte Dateilänge ab und erst nachher erfolgt das Übertragen). Aber immerhin, es tut sich mal was. Werde jetzt mal die Routinen - wie DG-luke und Klaus01 beschrieben ebenfalls näher untersuchen. mfg Herbert |
Re: Indy 10 - Progressbar arbeitet nicht mehr mit OnWork
Mein Fortschrittsbalken funktioniert nun auch beim Upload !!! :firejump:
Aber nicht zu früh freuen - es ist immer noch ein Provisorim. Der Fehler liegt in der Pufferung beim Senden. Hier wird das DoWork nicht aufgerufen. Ich habe mir bis jetzt einfach so geholfen, dass ich den Upload ohne Pufferung durchführe. Hierzu habe ich den QuellCode folgendermassen geändert: Änderung im TIdIOHandler: procedure TiDIOHandler.Write(AStream: TIdStream; ASize: Int64 = 0; AWriteByteCount: boolean = FALSE); begin ... ... ... nach Zeile Nr. 1233, wo steht: LBufferingStarted := not WriteBufferingActive; habe ich einfach die Zeile: LBufferingStarted := false eingefügt. So funktioniert mal alles, wie es soll. Ich werde aber noch weitersuchen, wo in der Pufferung der Aufruf für DoWork fehlt. mfg Herbert |
Re: Indy 10 - Progressbar arbeitet nicht mehr mit OnWork
Hm wo befindet sich denn die TIdIOHandler datei genau ?
Thx |
Re: Indy 10 - Progressbar arbeitet nicht mehr mit OnWork
Das ist ein Auszug aus IdIOHandler vom letzen Snapshot von Indy 10.
Wie man sieht ist dort das buffering auskommentiert. Herbert hat das ja auf andere Weise gelöst.
Delphi-Quellcode:
Nun der Auszug aus idIOHandlerStack:
procedure TIdIOHandler.Write(AStream: TIdStream; ASize: Int64 = 0;
AWriteByteCount: Boolean = FALSE); var LBuffer: TIdBytes; LBufSize: Integer; // LBufferingStarted: Boolean; begin if ASize < 0 then begin //"-1" All form current position LBufSize := AStream.Position; ASize := AStream.Size; //todo1 is this step required? AStream.Position := LBufSize; ASize := ASize - LBufSize; end else if ASize = 0 then begin //"0" ALL ASize := AStream.Size; AStream.Position := 0; end; //else ">0" ACount bytes EIdIOHandlerRequiresLargeStream.IfTrue((ASize > High(Integer)) and (not LargeStream)); // RLebeau 3/19/2006: DO NOT ENABLE WRITE BUFFERING IN THIS METHOD! // // When sending large streams, especially with LargeStream enabled, // this can easily cause "Out of Memory" errors. It is the caller's // responsibility to enable/disable write buffering as needed before // calling one of the Write() methods. // // Also, forcing write buffering in this method is having major // impacts on TIdFTP, TIdFTPServer, and TIdHTTPServer. { LBufferingStarted := not WriteBufferingActive; LBufferingStarted := False; if LBufferingStarted then begin WriteBufferOpen; end; } //try if AWriteByteCount then begin if LargeStream then begin Write(ASize); end else begin Write(Integer(ASize)); end; end; BeginWork(wmWrite, ASize); try while ASize > 0 do begin SetLength(LBuffer, FSendBufferSize); //BGO: bad for speed LBufSize := Min(ASize, FSendBufferSize); // Do not use ReadBuffer. Some source streams are real time and will not // return as much data as we request. Kind of like recv() // NOTE: We use .Size - size must be supported even if real time LBufSize := TIdStreamHelper.ReadBytes(AStream, LBuffer, LBufSize); if LBufSize = 0 then begin raise EIdNoDataToRead.Create(RSIdNoDataToRead); end; SetLength(LBuffer, LBufSize); Write(LBuffer); // RLebeau: DoWork() is called in TIdIOHandlerStack.WriteDirect() <--------------- //DoWork(wmWrite, LBufSize); <--- vielleicht wenn es nicht laufen sollte, hier doWork wieder aktivieren. Dec(ASize, LBufSize); end; finally EndWork(wmWrite); LBuffer := nil; end; { if LBufferingStarted then begin WriteBufferClose; end; except if LBufferingStarted then begin WriteBufferCancel; end; raise; end; } end;
Delphi-Quellcode:
Wo der aufgerufen wird ist mir aber nicht ersichtlich.
procedure TIdIOHandlerStack.WriteDirect(var ABuffer: TIdBytes);
var LCount: Integer; LPos: Integer; LSize: Integer; begin inherited WriteDirect(ABuffer); Assert(Binding<>nil); LSize := Length(ABuffer); LPos := 0; repeat LCount := Binding.Send(ABuffer, LPos, LSize - LPos); // TODO - Have a AntiFreeze param which allows the send to be split up so that process // can be called more. Maybe a prop of the connection, MaxSendSize? TIdAntiFreezeBase.DoProcess(False); FClosedGracefully := LCount = 0; // Check if other side disconnected CheckForDisconnect; DoWork(wmWrite, LCount); Inc(LPos, LCount); until LPos >= LSize; end; Grüße Klaus |
Re: Indy 10 - Progressbar arbeitet nicht mehr mit OnWork
Liste der Anhänge anzeigen (Anzahl: 1)
Hm also ich find die Stelle im Code nicht koennt mir jmd helfen oder hab ich die falsche Datei ?
|
Re: Indy 10 - Progressbar arbeitet nicht mehr mit OnWork
Hallo,
Du hast Die Version 10.0.52 inzwischen wurde idIOHandler geändert. Die letzte Version findest Du hier -> ![]() Wie der Name schon sagt eine Entwicklungs Snapshot. Grüße Klaus |
Re: Indy 10 - Progressbar arbeitet nicht mehr mit OnWork
Danke
aber anscheinend is der Mirror offline NOTE: This mirror is currently offline due to misuse. It will be reopened shortly. :cry: muss ich wohl warten |
Re: Indy 10 - Progressbar arbeitet nicht mehr mit OnWork
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:07 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