until ((tmp <> '') or (WaitForSingleObject(MyThread.Handle, 5) = WAIT_FAILED));
Das ist die Lösung, auf den String zu achten, super Idee Edelfix. Danke! Nun klappt es exakt so wie ich es wollte, ich kann abbrechen, ich bekomme 'Download aborted.' und Thread schließt sich bzw bei Nicht-Abbruch bekomme ich auch das Ergebnis
edit
Falls jemand mal brauchen sollte, so sieht eine Funktion aus die einen Thread startet und wartet bis der fertig ist um aus dem Thread einen String als Funktion = Result zu überreichen. Eine Abbruch-Funktion ist per Boolean CancelThread integriert.
Delphi-Quellcode:
function TFormMain.GetTHTTPClient ( Const xURL : String ) : String;
var
tmp : String;
MyThread: TThread;
begin
tmp := '';
CancelThread := False;
MyThread := TThread.CreateAnonymousThread(
procedure
var
HttpClient: THttpClient;
HttpResponse: IHttpResponse;
begin
HttpClient := THTTPClient.Create;
try
HttpResponse := HttpClient.Get( xURL );
tmp := HttpResponse.ContentAsString();
finally
HttpClient.Free;
end;
end
);
MyThread.FreeOnTerminate := True;
MyThread.Start;
repeat
Application.ProcessMessages;
Sleep(5);
if CancelThread then
begin
ButtonDownload.Enabled := True;
ButtonSaveOriginal.Enabled := False;
ButtonCancelDownload.Enabled := False;
CancelThread := False;
tmp := 'Download aborted.';
MyThread.Terminate;
end;
until ((tmp <> '') or (WaitForSingleObject(MyThread.Handle, 5) = WAIT_FAILED));
Result := tmp;
end;
Durch die Art der Abfrage in der Repeat-Schleife sollte meines Wissens alles glatt laufen, entweder es existiert ein String oder Thread hat sich geschlossen.
Was haltet Ihr davon?