Einzelnen Beitrag anzeigen

Incocnito

Registriert seit: 28. Nov 2016
210 Beiträge
 
#11

AW: Thread mit TRestRequest

  Alt 1. Jul 2021, 12:39
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.
  Mit Zitat antworten Zitat