Im attachten Beipielprogramm startet ein Buttpon einen Task. Der zweite Button beendet ihn. Soweit so gut.
Code:
procedure TForm1.Button1Click(Sender: TObject);
begin
Button1.Enabled := false;
Button1.Text := 'Task running';
fTask := TTask.Run(procedure()
begin
repeat
if TTask.CurrentTask.Status = TTaskStatus.Canceled then
break;
Sleep(10);
TThread.Synchronize(nil, procedure()
begin
Button1.Text := DateTimeToStr(Now);
end);
until false;
Sleep(100);
Button1.Enabled := true;
Button1.Text := 'Start Task';
end);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
if Assigned(fTask) then begin
fTask.Cancel;
end;
end;
Wenn ich das Formular schließe, möchte ich das gleiche machen + auch warten, bis der Task sicher beendet ist:
Code:
procedure TForm1.FormDestroy(Sender: TObject);
begin
if Assigned(fTask) then begin
fTask.Cancel;
while Button1.Enabled = false do;
end;
end;
Das funktioniert aber nicht, das programm hängt irgendwo im Nirwana. Nimmt man den teil im Task mit TThread.Synchronize raus, funktioniert das wie gewünscht.
Was übersehe ich da?