AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Indy 10 - Progressbar arbeitet nicht mehr mit OnWork
Thema durchsuchen
Ansicht
Themen-Optionen

Indy 10 - Progressbar arbeitet nicht mehr mit OnWork

Ein Thema von hsbc · begonnen am 25. Jul 2006 · letzter Beitrag vom 15. Dez 2008
Antwort Antwort
Seite 3 von 4     123 4      
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#21

Re: Indy 10 - Progressbar arbeitet nicht mehr mit OnWork

  Alt 28. Jul 2006, 10:00
Naja, FOnWork steht da jedenfalls nicht drin. Schlecht.
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.771 Beiträge
 
Delphi 10.4 Sydney
 
#22

Re: Indy 10 - Progressbar arbeitet nicht mehr mit OnWork

  Alt 28. Jul 2006, 10:09
Muß auch nicht, ich denke das Event sollte in diesem Methodenaufruf
ausgelöst werden, bzw. OnWork gesetzt werden:

FDataChannel.IOHandler.Write(ASource,0, false); // from beginning Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
hsbc

Registriert seit: 28. Jan 2004
Ort: Krems/Donau
404 Beiträge
 
Delphi 7 Professional
 
#23

Re: Indy 10 - Progressbar arbeitet nicht mehr mit OnWork

  Alt 28. Jul 2006, 10:23
Hallo allerseits,

Ich habe in meiner Application im OnCreate Ereignis gleich folgendes gesetzt:

Delphi-Quellcode:
  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;
Das funktioniert auch soweit.

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
  Mit Zitat antworten Zitat
hsbc

Registriert seit: 28. Jan 2004
Ort: Krems/Donau
404 Beiträge
 
Delphi 7 Professional
 
#24

Re: Indy 10 - Progressbar arbeitet nicht mehr mit OnWork

  Alt 28. Jul 2006, 16:06
Mein Fortschrittsbalken funktioniert nun auch beim Upload !!!

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
  Mit Zitat antworten Zitat
Benutzerbild von DeluxXx
DeluxXx

Registriert seit: 3. Jul 2006
92 Beiträge
 
#25

Re: Indy 10 - Progressbar arbeitet nicht mehr mit OnWork

  Alt 28. Jul 2006, 17:03
Hm wo befindet sich denn die TIdIOHandler datei genau ?
Thx
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.771 Beiträge
 
Delphi 10.4 Sydney
 
#26

Re: Indy 10 - Progressbar arbeitet nicht mehr mit OnWork

  Alt 28. Jul 2006, 18:58
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:
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;
Nun der Auszug aus idIOHandlerStack:
Delphi-Quellcode:
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;
Wo der aufgerufen wird ist mir aber nicht ersichtlich.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von DeluxXx
DeluxXx

Registriert seit: 3. Jul 2006
92 Beiträge
 
#27

Re: Indy 10 - Progressbar arbeitet nicht mehr mit OnWork

  Alt 31. Jul 2006, 10:22
Hm also ich find die Stelle im Code nicht koennt mir jmd helfen oder hab ich die falsche Datei ?
Angehängte Dateien
Dateityp: zip idiohandler_682.zip (13,1 KB, 14x aufgerufen)
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.771 Beiträge
 
Delphi 10.4 Sydney
 
#28

Re: Indy 10 - Progressbar arbeitet nicht mehr mit OnWork

  Alt 31. Jul 2006, 10:39
Hallo,

Du hast Die Version 10.0.52 inzwischen wurde
idIOHandler geändert.
Die letzte Version findest Du hier -> http://www.indyproject.org/Sockets/D...apshot.en.aspx
Wie der Name schon sagt eine Entwicklungs Snapshot.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von DeluxXx
DeluxXx

Registriert seit: 3. Jul 2006
92 Beiträge
 
#29

Re: Indy 10 - Progressbar arbeitet nicht mehr mit OnWork

  Alt 31. Jul 2006, 11:04
Danke
aber anscheinend is der Mirror offline
NOTE: This mirror is currently offline due to misuse. It will be reopened shortly.

muss ich wohl warten
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.771 Beiträge
 
Delphi 10.4 Sydney
 
#30

Re: Indy 10 - Progressbar arbeitet nicht mehr mit OnWork

  Alt 31. Jul 2006, 11:11
Oder auf diesen Mirror schauen: http://indy.fulgan.com/ZIP/

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 4     123 4      


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 09:02 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