Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi [Indy 10] IOHandler hinzufügen (https://www.delphipraxis.net/132010-%5Bindy-10%5D-iohandler-hinzufuegen.html)

TheMiller 4. Apr 2009 10:23


[Indy 10] IOHandler hinzufügen
 
Hallo,

nach einem Update von Indy 9 auf Indy 10 habe ich bemerkt, dass die Progressbars nicht mehr funktionieren bzw. das OnWork nicht mehr aufgerufen wird. Habe hier im Forum gelesen, dass ein IOHandler hinzugefügt werden muss. Es war die Rede von TIdIOHandler.

Nun habe ich gesucht, aber nichts gefunden. Schließlich habe ich es so gemacht:

Delphi-Quellcode:
Http:=TIdHTTP.Create(nil);
IO:=TIdIOHandler.Create(nil);
with http do
begin
  http.IOHandler:=IO;
  http.IOHandler.SendBufferSize:=1024;
  http.IOHandler.RecvBufferSize:=1024;
end;
Wenn ich nun einen Download starte, erscheint immer die Meldung Abstrakter Fehler.

Was mache ich falsch? Reicht es überhaupt, einfach einen IOHandler mit der idHTTP-Komponente zu verknüpfen um das OnWork der idHTTP wieder zum Laufen zu bekommen?

Danke im Voraus

DeddyH 4. Apr 2009 10:26

Re: [Indy 10] IOHandler hinzufügen
 
Sind die IO-Handler nicht Komponenten? Ich meine, ich hätte die gestern im Bezug auf eine andere Frage auf einem eigenen Reiter der Komponentenpalette gesehen. Also vermute ich mal, dass TIOHandler lediglich eine abstrakte Basisklasse dieser Komponenten ist, was den Fehler erklären würde. Welche Komponente nun aber da die richtige ist, weiß ich leider auch nicht, ich bin kein Indy-Experte.

TheMiller 4. Apr 2009 10:43

Re: [Indy 10] IOHandler hinzufügen
 
Hm. ja - da hast du schon recht. Hatte vergessen, das in meinem Post zu erwähnen. Ich weis es nämlich auch nicht. Habe jetzt mal IdIOHandlerStream benutzt, und jetzt kommt kein Fehler mehr. Allerdings wird auch nichts mehr heruntergeladen. Er sagt sofort, dass er fertig ist.

Weist du, wie man mit dem Handler umgeht?

DeddyH 4. Apr 2009 10:52

Re: [Indy 10] IOHandler hinzufügen
 
Zitat:

Zitat von DJ-SPM
Weist du, wie man mit dem Handler umgeht?

Leider nein, wie ich bereits sagte, aber da gibt es doch bestimmt Tutorials dazu. Bei Google suchendelphi indy 10 iohandler tutorial

Assertor 4. Apr 2009 11:24

Re: [Indy 10] IOHandler hinzufügen
 
Hi,

Zitat:

Zitat von DeddyH
Also vermute ich mal, dass TIOHandler lediglich eine abstrakte Basisklasse dieser Komponenten ist, was den Fehler erklären würde.

Absolut richtig!

Zitat:

Zitat von DJ-SPM
Habe hier im Forum gelesen, dass ein IOHandler hinzugefügt werden muss. Es war die Rede von TIdIOHandler.

Wo steht denn sowas? Nein, das brauchst Du nicht - außer Du willst SSL nutzen, dann ist es aber der SSL-IOHandler.

Zitat:

Zitat von DJ-SPM
Reicht es überhaupt, einfach einen IOHandler mit der idHTTP-Komponente zu verknüpfen um das OnWork der idHTTP wieder zum Laufen zu bekommen?

Du brauchst keinen IOHandler zuzuweisen, um OnWork zu nutzen. OnWork funktioniert in Indy 10, ich nutze es ja selber... Es stimmt also eher was mit dem anderen Code für den ProgressBar nicht.

Gruß Assertor

TheMiller 4. Apr 2009 12:04

Re: [Indy 10] IOHandler hinzufügen
 
Naja, was soll denn da nicht stimmen? Hier mal der Code. (Mit Indy 9 hatte alles noch wunderbar funktioniert)

Achso: Der Download findet in einem Thread statt.

Die Zuweisung für das OnWork-Ereignis (Hauptprogramm / Main-Thread)

Delphi-Quellcode:
UpdateDownloader.OnWork:=OnThreadWork;
Die Progressbars

Delphi-Quellcode:

//Prozeduren-Kopf in private
procedure OnThreadWork(Sender: TThread; const AWorkCount: Integer);

procedure TForm4.OnThreadWork(Sender: TThread; const AWorkCount: Integer);
begin
  Progressbar1.Position:=AWorkCount;
  Progressbar2.Position:=geladen+AWorkCount;
  //Bringt nix:
  //Progressbar1.Refresh;
  //Progressbar2.Refresh;
end;

Im DownloadThread

Delphi-Quellcode:

TOnWorkEvent = procedure(Sender: TThread; const AWorkCount: Integer) of object;

TDownloadUpdates = class(TThread)
  private
    procedure InternalOnWork(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer);
    procedure DoNotifyWork;
  published
    property OnWork: TOnWorkEvent read FOnWorkEvent write FOnWorkEvent;
  end;

procedure TDownloadUpdates.InternalOnWork(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer);
begin
  FWorkCount:=AWorkCount;
  Synchronize(DoNotifyWork);
end;

procedure TDownloadUpdates.DoNotifyWork;
begin
  if (Assigned(OnWork)) then
    OnWork(Self, FWorkCount);
end;
Das hat so alles funktioniert. Ich hoffe, ich habe alles Wichtige jetzt kopiert.

Assertor 4. Apr 2009 12:22

Re: [Indy 10] IOHandler hinzufügen
 
Hi,

Zitat:

Zitat von DJ-SPM
Naja, was soll denn da nicht stimmen? Hier mal der Code. (Mit Indy 9 hatte alles noch wunderbar funktioniert)

Da gibt es einiges, was man falsch machen kann...

Zitat:

Zitat von DJ-SPM
Achso: Der Download findet in einem Thread statt.

...

Delphi-Quellcode:
procedure TDownloadUpdates.DoNotifyWork;
begin
  if (Assigned(OnWork)) then // hier einen Breakpoint!
    OnWork(Self, FWorkCount);
end;
Das hat so alles funktioniert. Ich hoffe, ich habe alles Wichtige jetzt kopiert.

Also:

1) Wo wird die IdHTTP Instanz erstellt und das OnWork zugewiesen? Das fehlt im geposteten Code.
2) Was sagt denn der Debugger wenn Du oben einen Breakpoint setzt und reinsteppst? Stimmt FWorkCount und wird OnWork() aufgerufen?

Edit: Ich frage deswegen, weil ich selbst mit Indy 10 seit langem produktiv genau das gleiche mache. Auch in einem Thread, mit OnWork und Status-Sync - ein Progressbar wird ebenfalls aktualisiert... Und das mit der original Indy 10 von D2006 über die D2009 Version bis hin zum aktuellen Indy SVN. Also an Indy liegt es daher bestimmt nicht ;)

Gruß Assertor

TheMiller 4. Apr 2009 12:28

Re: [Indy 10] IOHandler hinzufügen
 
Hey,

erstellt wird die Instanz folgendermaßen

Main:

Delphi-Quellcode:
  //Instanz wird hier erstellt
  UpdateDownloader:=TDownloadUpdates.Create(True);
  UpdateDownloader.DownloadPath:=ExtractFilePath(ParamStr(0))+'Updates';
  UpdateDownloader.OnTerminate:=DownloadFinished;
  UpdateDownloader.FreeOnTerminate:=True;
  //Und hier wird das OnWork zugewiesen
  UpdateDownloader.OnWork:=OnThreadWork;
  UpdateDownloader.OnWorkBegin:=OnThreadWorkBegin;
  UpdateDownloader.OnFinish:=OnThreadFinished;
  UpdateDownloader.Resume;
Thread:

Delphi-Quellcode:
constructor TDownloadUpdates.Create(CreateSuspended: Boolean);
begin
  inherited Create(True);

  Http:=TIdHTTP.Create(nil);
end;
Heruntergeladen werden die Dateien korrekt. Größe > 3MB.

zu 2.: Das mit dem Breakpoint etc habe ich noch nicht gemacht. Erst recht nicht, wie man die Variablen auslesen kann. Kannst du mir das kurz erklären? Ich nutze Delphi 2007

Vielen Dank

Assertor 4. Apr 2009 12:37

Re: [Indy 10] IOHandler hinzufügen
 
Hi,

Delphi-Quellcode:
constructor TDownloadUpdates.Create(CreateSuspended: Boolean);
begin
  inherited Create(True);
  Http:=TIdHTTP.Create(nil);
  Http.OnWork := InternalOnWork; // das vermisse ich irgendwie
end;
Mit dem Breakpoint geht einfach:

In dem Sourcecode links neben der Zeilennummer klicken, bis ein roter Punkt dort erscheint. Wenn dieser beim Ausführen des Projekts in der Delphi IDE zum "roten X" wird, mußt Du eventuell den Punkt eine Zeile höher/tiefer setzen. Zusätzlich das Projekt im Debug-Mode erstellen und vollständig neukompilieren.

Dann hält der Debugger Deine Anwendung und ggf. den Thread an genau der Stelle an - Du kannst dann in der IDE auch die Zuweisungen und Objekte/Variablen ansehen. Das Durchsteppen bedeutet einzelne Zeilen ausführen und mit F7 auch den Aufrufen zu folgen (in Deinem Fall also dem OnWork).

Zurück zum Problem:

Ich vermute jetzt mal, Deine eigentliche Thread-OnWork Prozedur wird nicht ausgeführt, da diese dem IdHTTP Objekt nicht zugewiesen wird (siehe Code oben).

Gruß Assertor

TheMiller 4. Apr 2009 12:49

Re: [Indy 10] IOHandler hinzufügen
 
Danke, aber wie erstelle ich das Projekt im Debug Mode?

Aber soll ich dir was sagen? Pass mal auf:

Indy 9 hat bei der Umstellung auf Indy 10 die Parameterliste dür OnWork* geändert. Damit ich das Projekt erstmal zum Laufen bekomme, habe ich damals einfach die von dir vermisste Zeile rausgeschmissen.

Habe sie gerade an die neue Parameterliste angepasst, eingefüt und jetzt funktioniert es wieder. Wie konnte mir das nur passieren ;)

Vielen Dank!

Könntest du mir das mit dem Debug-Mode trotzdem noch erklären?


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