AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein IdHTTP Get im Thread sofort unterbrechen?
Thema durchsuchen
Ansicht
Themen-Optionen

IdHTTP Get im Thread sofort unterbrechen?

Ein Thema von LTE5 · begonnen am 1. Jan 2018 · letzter Beitrag vom 2. Jan 2018
Antwort Antwort
Seite 1 von 2  1 2      
LTE5

Registriert seit: 13. Nov 2017
355 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#1

IdHTTP Get im Thread sofort unterbrechen?

  Alt 1. Jan 2018, 15:31
Mit dieser Unit erspare ich mir doppelten Code und erzeuge eine TIdHTTP-Instanz
Delphi-Quellcode:
unit HTTPObject;

interface

uses
 System.Classes, IdHTTP, IdSSLOpenSSL;

type
 THTTPObject = class(TIdHTTP)

 private
  IOHndl: TIdSSLIOHandlerSocketOpenSSL;
 public
  constructor Create(AOwner: TComponent);
  destructor Destroy; override;
 end;

implementation

constructor THTTPObject.Create(AOwner: TComponent);
begin
 inherited;

 IOHndl := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
 Request.BasicAuthentication := True;
 HandleRedirects := False;
 IOHandler := IOHndl;
 ReadTimeout := 10000;
end;

destructor THTTPObject.Destroy;
begin
 IOHndl.Free;

 inherited;
end;

end.
Delphi-Quellcode:
aHTTP := THTTPObject.Create(nil);
try
 X := aHTTP.Get( --- );
finally
 aHTTP.Free;
end;
Obiger Aufruf ist in einem Thread.

Wie kann ich nun bei Programmbeendigung dieses Get() sofort unterbrechen?
Den Thread terminieren funktioniert leider nicht wegen dem Get() was noch am arbeiten ist.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.159 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: IdHTTP Get im Thread sofort unterbrechen?

  Alt 1. Jan 2018, 15:41
http://www.delphipraxis.net/173890-w...gewaltsam.html

Tl;dr: Klar kannst du ihn, z.B. mit WinApi-Routinen hart abschießen. Aber man sollte das nicht tun. Wenn jemand in meinem Büro ist und ich meine Ruhe haben möchte bitte ich ihn auch freundlich den Raum zu verlassen und schieße ihm nicht einfach in den Kopf.
  Mit Zitat antworten Zitat
LTE5

Registriert seit: 13. Nov 2017
355 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#3

AW: IdHTTP Get im Thread sofort unterbrechen?

  Alt 1. Jan 2018, 15:41
Es geht mir nicht um den Thread sondern um das IdHTTP.Get.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.159 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: IdHTTP Get im Thread sofort unterbrechen?

  Alt 1. Jan 2018, 15:49
Die Suchmaschine meines Vertrauens meint man könne das OnWork -Event verwenden um dort dann abzubrechen, z.B. mittels Disconnect() oder Werfen einer Exception.

Aber das hast du sicher schon gesehen - Wird das Event nicht aufgerufen bei deinem hohen ReadTimeout wenn er einfach nur hängt?
  Mit Zitat antworten Zitat
LTE5

Registriert seit: 13. Nov 2017
355 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#5

AW: IdHTTP Get im Thread sofort unterbrechen?

  Alt 1. Jan 2018, 15:52
Zitat:
Aber das hast du sicher schon gesehen - Wird das Event nicht aufgerufen bei deinem hohen ReadTimeout wenn er einfach nur hängt?
Noch nicht. Ich gucke gleich mal nach was passiert wenn ich Disconnect aufrufe.

Wie hoch sollte so ein Timeout denn gewöhnlich sein?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.069 Beiträge
 
Delphi 12 Athens
 
#6

AW: IdHTTP Get im Thread sofort unterbrechen?

  Alt 1. Jan 2018, 16:01
Einen Thread kann/darf man niemals von außen "beenden". Man muß immer dem Thread, bzw. dem Code darin, sagen, dass er sich beenden soll.
Die potentiellen Folgen wären sonst Deadlocks, Speicherlecks oder Schlimmeres.

Also TThread.Terminate und TThread.Terminated im Thread.
Und natürlich den "länger" wartenden Funktionen im Thread. (ebenfalls auf Terminated reagieren oder z.B. Terminate überschreiben und das da durchreichen)

Im genannten OnWork könntest du dann diese Anfrage prüfen, oder du suchst in TIdHTTP oder besser im TIdHTTP.IOHandler, ob es da einen Cancel-Befehl gibt.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 1. Jan 2018 um 16:04 Uhr)
  Mit Zitat antworten Zitat
LTE5

Registriert seit: 13. Nov 2017
355 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#7

AW: IdHTTP Get im Thread sofort unterbrechen?

  Alt 1. Jan 2018, 16:03
Einen Cancelbefehl gibt es nicht.
Das hier führt auch nicht zum Erfolg. Es dauert immer circa 19 Sekunden bis das Programm beendet wird.

Delphi-Quellcode:
type
 THTTPObject = class(TIdHTTP)

 private
  FCanceled: Boolean;
  IOHndl: TIdSSLIOHandlerSocketOpenSSL;
  procedure FOnWork(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Int64);
 public
  constructor Create(AOwner: TComponent);
  destructor Destroy; override;

 published
  property Canceled: Boolean read FCanceled write FCanceled;
 end;

implementation

constructor THTTPObject.Create(AOwner: TComponent);
begin
 inherited;

 FCanceled := False;
 IOHndl := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
 Request.BasicAuthentication := True;
 HandleRedirects := False;
 IOHandler := IOHndl;
 ReadTimeout := 10000;

 OnWork := FOnWork;
end;

procedure THTTPObject.FOnWork(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Int64);
begin
 if FCanceled then
  begin
   raise Exception.Create('Disconnect');

   Disconnect;
  end;
end;
Delphi-Quellcode:
aHTTP.Canceled := True;
_Thread.Terminate; // Wird respektiert: "einen Thread kann/darf man niemals von außen "beenden". Man muß immer dem Thread, bzw. dem Code darin, sagen, dass er sich beenden soll."

Geändert von LTE5 ( 1. Jan 2018 um 16:06 Uhr)
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
969 Beiträge
 
Delphi 6 Professional
 
#8

AW: IdHTTP Get im Thread sofort unterbrechen?

  Alt 1. Jan 2018, 17:15
Hmm..

Delphi-Quellcode:
procedure THTTPObject.FOnWork(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Int64);
begin
 if FCanceled then
  begin
   raise Exception.Create('Disconnect');

   Disconnect;
  end;
end;
Dir ist bewusst, dass das 'Disconnect' nach dem 'raise Exception..' nie zur Ausführung kommt?

Versuche mal ein Tausch.

(Ungetestet, nur so gelesen...)
  Mit Zitat antworten Zitat
LTE5

Registriert seit: 13. Nov 2017
355 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#9

AW: IdHTTP Get im Thread sofort unterbrechen?

  Alt 1. Jan 2018, 17:22
Zitat:
Dir ist bewusst, dass das 'Disconnect' nach dem 'raise Exception..' nie zur Ausführung kommt?
Habe schon sämtliche Kombinationen durch. Selbst wenn das Disconnect ausgeführt wird muss ich diese 20 Sekunden warten.

Genau hier beim Head muss ich warten. Vollkommen egal welche URL ich eingebe. Bei Get muss ich ebenfalls warten.

Ich habe glaube ich vergessen zu erwähnen, dass ich nur warten muss wenn keine Internetverbindung besteht.
Delphi-Quellcode:

// Unit 1
aHTTP := THTTPObject.Create(nil);
try
 if UrlCheck(aHTTP, ---) = 200 then
  .....

// Unit 2
function UrlCheck(aHTTP: THTTPObject = nil; sUrl: string = ''): Integer;
begin
 Result := -1;

 try
  if sUrl <> 'then
   begin
    aHTTP.Head(sUrl);
    Result := aHTTP.Response.ResponseCode;
   end;
 except
  Result := GetLastError;
 end;
end;
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: IdHTTP Get im Thread sofort unterbrechen?

  Alt 1. Jan 2018, 22:52
Hallo,
das ist der TimeOut von Windows.
Kannst Du den nicht in der Komponente zusetzen?
Heiko
  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 13:31 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