Musst du dir denn einen eigenen Thread bauen?
Kannst du nicht das TCustomRESTRequest.ExecuteAsync nutzen und für das Abbrechen das dafür vorgesehene Cancel?
Delphi-Quellcode:
procedure TForm3.FormClick(Sender: TObject);
var
RESTThread: TRESTExecutionThread;
begin
RESTThread := RESTRequest1.ExecuteAsync({Bitte hier die optionalen Argumente beachten wie CompletionHandler und CompletionHandlerWithError});
// Bla blupp, dauert alles zu lange:
if Assigned(RESTThread) then
RESTThread.Cancel;
end;
Interessanter Ansatz, hat aber letztlich nicht so geil geklappt.
Delphi-Quellcode:
...
tempThread := Whatever();
// Speichern der lokalen Objekte, damit man beim OnAccept oder OnError
// auch damit arbeiten kann:
mainThread := tempThread;
mainClient := tempClient;
mainRequest := tempRequest;
mainResponse := tempResponse;
// Warten, bis entweder der Thread von außen beendet wird (Terminated) oder
// er selbst fertig wird (FRecieved):
while (NOT Terminated) AND (NOT FRecieved) do
begin
Sleep(10);
end;
// Wenn hier angekommen schauen, ob er hier ankommt, weil er Daten
// empfangen hat. Falls es durch "Terminate" von außen passiert ist
// den Rest-Thread mit "Cancel();" abbrechen:
if (Terminated) AND (NOT FRecieved) then mainThread.Cancel();
// Warten, bis er den Thread ordnungsgemäß beendet hat:
mainThread.WaitFor();
// Jetzt sind wir hier fertig, das Programm soll beendet werden,
// also alles wieder freigeben:
mainClient.Free();
mainRequest.Free();
mainResponse.Free();
mainThread.Free();
Beim Freigeben kommt es immer zu Fehlern. Es sieht auch nicht so aus,
als ob Cancel die Rest-Abfrage tatsächlich abbrechen würde,
respektive das WaitFor dann wartet, bis der Abbruch durch ist.