![]() |
[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:
Wenn ich nun einen Download starte, erscheint immer die Meldung Abstrakter Fehler.
Http:=TIdHTTP.Create(nil);
IO:=TIdIOHandler.Create(nil); with http do begin http.IOHandler:=IO; http.IOHandler.SendBufferSize:=1024; http.IOHandler.RecvBufferSize:=1024; end; 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 |
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.
|
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? |
Re: [Indy 10] IOHandler hinzufügen
Zitat:
![]() |
Re: [Indy 10] IOHandler hinzufügen
Hi,
Zitat:
Zitat:
Zitat:
Gruß Assertor |
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:
Die Progressbars
UpdateDownloader.OnWork:=OnThreadWork;
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:
Das hat so alles funktioniert. Ich hoffe, ich habe alles Wichtige jetzt kopiert.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; |
Re: [Indy 10] IOHandler hinzufügen
Hi,
Zitat:
Zitat:
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 |
Re: [Indy 10] IOHandler hinzufügen
Hey,
erstellt wird die Instanz folgendermaßen Main:
Delphi-Quellcode:
Thread:
//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;
Delphi-Quellcode:
Heruntergeladen werden die Dateien korrekt. Größe > 3MB.
constructor TDownloadUpdates.Create(CreateSuspended: Boolean);
begin inherited Create(True); Http:=TIdHTTP.Create(nil); end; 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 |
Re: [Indy 10] IOHandler hinzufügen
Hi,
Delphi-Quellcode:
Mit dem Breakpoint geht einfach:
constructor TDownloadUpdates.Create(CreateSuspended: Boolean);
begin inherited Create(True); Http:=TIdHTTP.Create(nil); Http.OnWork := InternalOnWork; // das vermisse ich irgendwie end; 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 |
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 03:28 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