![]() |
IdHTTP Get im Thread sofort unterbrechen?
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:
Obiger Aufruf ist in einem Thread.
aHTTP := THTTPObject.Create(nil);
try X := aHTTP.Get( --- ); finally aHTTP.Free; end; Wie kann ich nun bei Programmbeendigung dieses Get() sofort unterbrechen? Den Thread terminieren funktioniert leider nicht wegen dem Get() was noch am arbeiten ist. |
AW: IdHTTP Get im Thread sofort unterbrechen?
![]() 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. |
AW: IdHTTP Get im Thread sofort unterbrechen?
Es geht mir nicht um den Thread sondern um das IdHTTP.Get.
|
AW: IdHTTP Get im Thread sofort unterbrechen?
Die Suchmaschine meines Vertrauens meint man könne das
Delphi-Quellcode:
-Event verwenden um dort dann abzubrechen, z.B. mittels
OnWork
Delphi-Quellcode:
oder Werfen einer Exception.
Disconnect()
Aber das hast du sicher schon gesehen - Wird das Event nicht aufgerufen bei deinem hohen
Delphi-Quellcode:
wenn er einfach nur hängt?
ReadTimeout
|
AW: IdHTTP Get im Thread sofort unterbrechen?
Zitat:
Wie hoch sollte so ein Timeout denn gewöhnlich sein? |
AW: IdHTTP Get im Thread sofort unterbrechen?
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. |
AW: IdHTTP Get im Thread sofort unterbrechen?
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." |
AW: IdHTTP Get im Thread sofort unterbrechen?
Hmm..
Zitat:
Versuche mal ein Tausch. (Ungetestet, nur so gelesen...) |
AW: IdHTTP Get im Thread sofort unterbrechen?
Zitat:
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; |
AW: IdHTTP Get im Thread sofort unterbrechen?
Hallo,
das ist der TimeOut von Windows. Kannst Du den nicht in der Komponente zusetzen? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:01 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