Warum keinen Timer? Sonst brauche ich eine Schleife.
Wofür eine Schleife?
Ich starte die Verarbeitung in einem Thread und habe in der UI einen Timer, der alle x ms prüft, ob in der Queue für UI-Updates etwas drinnen steht. Der Thread befüllt dann diese Queue.
Und warum willst Du die UI Task damit nerven per Timer etwas auszulesen? Du hast doch den
TThread.Queue(NIL,Procedure...
Du hast TMessageManager vergessen.
Ich schicke (publish) gerne eine TMessage die mit TThread.Queue abgesichert an mein UI.
Dann braucht können sich ein oder mehrere UI's subscriben, ohne sich drum zu kümmern woher die Message kommt.
Das geht sicherlich auch - verwende ich auch gerne, wenn ich ein Multicast benötige.
Aber warum nicht einfach so:
Delphi-Quellcode:
procedure TForm319.UpdateUI(aNewValue : Integer);
begin
TThread.Queue(NIL,Procedure
begin
if Assigned(Button1) then // Form Closed?
Button1.Text := aNewValue.ToString;
end);
end;
procedure TForm319.Button1Click(Sender: TObject);
begin
Button1.Enabled := false;
TTask.Run(Procedure
var
LastOut : TDateTime;
i : Integer;
begin
LastOut := NOW;
for i:=0 to 600 do // 1 Min.
begin
sleep(100);
if MilliSecondsBetween(LastOut,Now) > 500 then
begin
if not(Assigned(Button1)) then // Form Closed?
exit;
UpdateUI(i);
LastOut := Now;
end;
end;
if Assigned(Button1) then
Button1.Enabled := true;
end);
end;