AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi TRestRequest beim Beenden abbrechen
Thema durchsuchen
Ansicht
Themen-Optionen

TRestRequest beim Beenden abbrechen

Ein Thema von TurboMagic · begonnen am 13. Jul 2022 · letzter Beitrag vom 14. Jul 2022
Antwort Antwort
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.938 Beiträge
 
Delphi 12 Athens
 
#1

TRestRequest beim Beenden abbrechen

  Alt 13. Jul 2022, 23:15
Hallo,

angenommen ich habe in Delphi 11.1 einen TRestRequest mittels Execute
in einem TTask gestartet. Das ist ein Post Request an einen entferten Server
der mitunter etwas dauert.

Wenn nun jemand das Programm (bei dessen Start dieser Request abgesetzt wird)
schließt, bevor der Request abgearbeitet ist, knallt es (laut Debugger genau
in der Zeile nach dem Execute Aufruf).

Wie kann ich so einen Request richtig abbrechen in der Situation?
Ich hab's schon mit Cancel versucht, aber das scheint nicht zu helfen.

Die TRestRequest Komponente liegt auf einem Datenmodul, wird aber von
anderen Klassen benutzt, wobei eine ein Interface definiert welches benutzt
wird.

Die Klasse, die dieses Interface benutzt wird beim beenden freigegeben.
Und nein: ich greife nicht in die Referenzzählung ein.

Grüße
TurboMagic

Geändert von TBx (15. Jul 2022 um 07:39 Uhr) Grund: Tipselfehler korrigiert
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.445 Beiträge
 
Delphi 12 Athens
 
#2

AW: TRestRequest beim Beenden abbrechen

  Alt 13. Jul 2022, 23:35
Kannst du das auf ein minimales Beispiel runterbrechen?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: TRestRequest beim Beenden abbrechen

  Alt 14. Jul 2022, 03:56
Erstmal würde ich empfehlen diese Komponente(n) in dem Task/Thread zu erstellen,
dort, wo sie dann verwendet wird, anstatt diese VCL-Komponente threadübergreifend zu verwenden.


Aber warum überhaupt ein Task (RESTRequest.Execute?)
anstatt RESTRequest.ExecuteAsync + OnAfterExecute?




PS, das passende Handle gefunden, könnte man auch in dieser Richtung mal weiter experimentieren:
https://docs.microsoft.com/en-us/win...i-o-operations
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (14. Jul 2022 um 03:59 Uhr)
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.938 Beiträge
 
Delphi 12 Athens
 
#4

AW: TRestRequest beim Beenden abbrechen

  Alt 14. Jul 2022, 08:02
Danke für den Async Tipp! Werde ich mir mal anschauen.
Dieses REST Zeugs ist halt noch neu für mich...

Was wäre dann der Standardweg das abzubrechen?
TRESTRequest.Cancel?
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.938 Beiträge
 
Delphi 12 Athens
 
#5

AW: TRestRequest beim Beenden abbrechen

  Alt 14. Jul 2022, 22:39
So, habe das jetzt auf ExecuteAsync umgestellt und die Aufrufen werden durch
das Entfernen des bisher benutzten TTasks viel schneller. Wow!

Dass ich den Synchronized Parameter auf True stellen sollte ist mir klar,
da meist irgendwann im Verlauf der Antwortverarbeitung was auf dem GUI ausgegeben wird.
Aber: es stellt sich mir jetzt noch die Frage wie der 3. Parameter AFreeThread
am besten zu setzen ist: true oder false?

Und der 4. Parameter ist in der Hilfe gar nicht beschrieben. Kann mir den mal
jemand erklären? Ich habe zwar einen Verdacht, aber eigentlich hatte ich bisher schon
anderweitig ein Fehlerbehandlungsevent eingebaut...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: TRestRequest beim Beenden abbrechen

  Alt 14. Jul 2022, 23:07
eigentlich ganz einfach ... PS: notfalls mal in den Code gucken


ACompletionHandler: TCompletionHandler = nil
ASynchronized: boolean = True
AFreeThread: boolean = True
ACompletionHandlerWithError: TCompletionHandlerWithError = nil
Result: TRESTExecutionThread

alle Parameter kann man ignorieren, wenn man sie nicht braucht (wenn nur OnAfterExecute, dann kann alles leer bleiben)

ACompletionHandler = anonyme Ereignis-Methode alternativ/zuzüglich zum OnAfterExecute
ACompletionHandlerWithError (aka AErrorHandler) = ähnlich wie Erstes ... ohne=wenn erfolgreich / mit=wenn Abfrage nicht erfolgreich
ASynchronized = CompletionHandler mit oder ohne Error sind synchronisiert (nur die beiden Methoden, nicht das Event OnAfterExecute)
AFreeThread = Auto-Free des internen TThread ... oder du speicherst dir das Result und gibst es am Ende selbst frei (selbst: NIEMALS innerhalb der Ereignismethoden)
Request.SynchronizedEvents = das "Synchronized" für OnAfterExecute
Request.OnHTTPProtocolError = ähnlich ACompletionHandlerWithError
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (14. Jul 2022 um 23:30 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.445 Beiträge
 
Delphi 12 Athens
 
#7

AW: TRestRequest beim Beenden abbrechen

  Alt 14. Jul 2022, 23:54
Aber: es stellt sich mir jetzt noch die Frage wie der 3. Parameter AFreeThread
am besten zu setzen ist: true oder false?
Wenn du den auf False setzt, kannst du den Rückgabewert von ExecuteAsync verwenden um das Cancel aufzurufen, falls du den Request selbst nicht mehr zur Hand hast.

Und der 4. Parameter ist in der Hilfe gar nicht beschrieben. Kann mir den mal
jemand erklären?
Der ACompletionHandlerWithError wird aufgerufen, wenn im Execute eine unbehandelte Exception auftritt (der Parameter enthält dann das Exception Object). Das gibt einmal die Möglichkeit einer freundlichen Meldung, aber auch die letzte Gelegenheit irgendwelche Dinge aufzuräumen, die eigentlich im ACompletionHandler gemacht werden, aber der wird bei einer Exception möglicherweise nicht mehr aufgerufen (außer die Exception kommt genau da her).
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Antwort Antwort


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 18:37 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