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

AW: IdHTTP Get im Thread sofort unterbrechen?

  Alt 1. Jan 2018, 15: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 15:06 Uhr)
  Mit Zitat antworten Zitat
HolgerX

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

AW: IdHTTP Get im Thread sofort unterbrechen?

  Alt 1. Jan 2018, 16: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
 
#3

AW: IdHTTP Get im Thread sofort unterbrechen?

  Alt 1. Jan 2018, 16: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.277 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: IdHTTP Get im Thread sofort unterbrechen?

  Alt 1. Jan 2018, 21:52
Hallo,
das ist der TimeOut von Windows.
Kannst Du den nicht in der Komponente zusetzen?
Heiko
  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, 21:57
Zitat:
das ist der TimeOut von Windows.
Gut zu wissen.
Zitat:
Kannst Du den nicht in der Komponente zusetzen?
Man kann zwei verschiedene Timeouts setzen aber beide interessieren Windows nicht.
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.593 Beiträge
 
Delphi 7 Professional
 
#6

AW: IdHTTP Get im Thread sofort unterbrechen?

  Alt 2. Jan 2018, 00:09
Wenn Windows wartet, dann wartet Windows. Erst wenn das mit der Warterei fertig ist, kannst Du im Programm reagieren, nur dass das dann sowieso schon reagiert.

Solange von Windows nix kommt, wird onWork nicht aufgerufen, da ja nicht "geworkt" wird. Von daher hilft es nichts, wenn man da Disconnect aufruft und/oder 'ne Exception wirft. OnWork eignet sich für Fortschrittsanzeigen ..., also alles, was man bei funktionierender Arbeit machen kann. Das ist beim TimeOut aber nicht gegeben.

Mir ist momentan kein Weg bekannt, wie man da "mal eben" rauskommt.

Eventuell dasda? http://smallbusiness.chron.com/chang...ons-45899.html

Eventuell mal mit windows internet timeout bei der Suchmaschine Deiner Wahl stöbern gehen.

In 'nem threadlosen Programm hab' ich das etwas unelegant gelöst:

Es gibt da 'nen Timer, im OnWorkBegin wird er eingeschaltet und im OnWorkEnd wieder ausgeschaltet. Der hat ein Interval von 15 Sekunden. Wenn er "zuschlägt" wird im Timerereignis sowas gemacht:
Delphi-Quellcode:
idhttp.Disconnect(True);
idhttp.IOHandler.InputBuffer.Clear;
Wenn Du den Timer und sein Ereignis mit in den Thread nehmen kannst, könnte das ja eventuell ein Lösungsansatz sein. Ob der gut ist, entscheiden bitte andere, mit Threads hab' ich es nicht so

Ein Ansatz zur Umsetzung ist aber eventuell garnicht so weit: Thread + Timer, Einbinden von TimerThread.pas bzw. im Ursprung: http://www.delphipraxis.net/1270100-post13.html
  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 2. Jan 2018, 00:36
So ganz verstehe ich nicht was es mit " http://www.delphipraxis.net/181814-t...hread-pas.html " aufsich hat.

Für mich ist das nur ein TThread mit Events zum Warten statt mit einem Sleep(1234).
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: IdHTTP Get im Thread sofort unterbrechen?

  Alt 2. Jan 2018, 00:37
Wenn/da Indy bestimmt ReadFile und WriteFile für das Auslesen/Senden des TCP-Datenstroms verwendet, kann man sowas z.B. über
MSDN-Library durchsuchenCancelIo, MSDN-Library durchsuchenCancelIoEx oder MSDN-Library durchsuchenCancelSynchronousIo aus jedem Thread unterbrechen.

Aber hier wartet es ja schon beim Öffnen der Verbindung (ala CreateFile oder so) und da gibt es keinen Abbruchbefehl, aber hier sollte man irgendwo auch den passenden Timeout einstellen können (denk ich mir).
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Towmuz

Registriert seit: 21. Sep 2016
Ort: Minden
127 Beiträge
 
Delphi 10.1 Berlin Professional
 
#9

AW: IdHTTP Get im Thread sofort unterbrechen?

  Alt 2. Jan 2018, 07:36
Ich habe glaube ich vergessen zu erwähnen, dass ich nur warten muss wenn keine Internetverbindung besteht.
Dann prüf doch erstmal ob eine Internetverbindung besteht bevor du was mit GET machst.
Thomas
  Mit Zitat antworten Zitat
Der schöne Günther

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

AW: IdHTTP Get im Thread sofort unterbrechen?

  Alt 2. Jan 2018, 09:22
Vielleicht bin ich nicht so schlau, aber wie soll man das konkret prüfen? Was er macht ist doch völlig legitim. Oder muss er vor dem Prüfen "ob eine Internetverbindung besteht" dann noch prüfen ob überhaupt eine Netzwerkkarte im PC steckt? Und davor prüfen ob ...
  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 04:37 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