AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi [Indy 10] IOHandler hinzufügen
Thema durchsuchen
Ansicht
Themen-Optionen

[Indy 10] IOHandler hinzufügen

Ein Thema von TheMiller · begonnen am 4. Apr 2009 · letzter Beitrag vom 4. Apr 2009
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#1

[Indy 10] IOHandler hinzufügen

  Alt 4. Apr 2009, 11:23
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
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#2

Re: [Indy 10] IOHandler hinzufügen

  Alt 4. Apr 2009, 11:26
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#3

Re: [Indy 10] IOHandler hinzufügen

  Alt 4. Apr 2009, 11:43
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?
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#4

Re: [Indy 10] IOHandler hinzufügen

  Alt 4. Apr 2009, 11:52
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
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Assertor

Registriert seit: 4. Feb 2006
Ort: Hamburg
1.296 Beiträge
 
Turbo C++
 
#5

Re: [Indy 10] IOHandler hinzufügen

  Alt 4. Apr 2009, 12:24
Hi,

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

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#6

Re: [Indy 10] IOHandler hinzufügen

  Alt 4. Apr 2009, 13:04
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)

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.
  Mit Zitat antworten Zitat
Assertor

Registriert seit: 4. Feb 2006
Ort: Hamburg
1.296 Beiträge
 
Turbo C++
 
#7

Re: [Indy 10] IOHandler hinzufügen

  Alt 4. Apr 2009, 13:22
Hi,

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

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#8

Re: [Indy 10] IOHandler hinzufügen

  Alt 4. Apr 2009, 13:28
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
  Mit Zitat antworten Zitat
Assertor

Registriert seit: 4. Feb 2006
Ort: Hamburg
1.296 Beiträge
 
Turbo C++
 
#9

Re: [Indy 10] IOHandler hinzufügen

  Alt 4. Apr 2009, 13:37
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
Frederik
  Mit Zitat antworten Zitat
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#10

Re: [Indy 10] IOHandler hinzufügen

  Alt 4. Apr 2009, 13:49
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?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 16:28 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