Falscher Ansatz - würde ich sagen -
Das ist ein klassischer Ansatz für Sir Rufo's Idleworker...
Hole dir
TMessageManager.DefaultManager.SubscribeToMessage( TIdleMessage, HandleIdleMessage );
Dann nimm eine TaskListe wie
FTasks: TQueue<TProc>;
In die Queue geht es mit
Delphi-Quellcode:
procedure TIdleWorker.Execute( Action: TProc );
begin
FTasks.Enqueue( Action );
end;
und die Verarbeitung geht so:
Delphi-Quellcode:
procedure TIdleWorker.HandleIdleMessage( const Sender: TObject; const m: TMessage );
var
LTask: TProc;
begin
if FTasks.Count > 0 then
begin
LTask := FTasks.Dequeue( );
LTask( );
end;
end;
Ich habe "ALLE" Application.Processmessages aus meiner App entfernt...
Warum waren die da drin?
Beispiel:
Delphi-Quellcode:
Procedure TForm1.Button1Click(Sender : TObject);
begin
Application.Processmessages;
MachewasLanges;
end;
Weil Firemonkey sonst NIE die Click oder Select Animation abspielt.. (Farbe setzen usw.)
Daher sieht der User keine Reaktion..
Daher mache ich meine Verarbeitung nur noch im Application.OnIdle -> der ruft die obere Message auf...
Dann sieht es so aus:
Delphi-Quellcode:
Procedure TForm1.Button1Click(Sender : TObject);
begin
TIdleWorker.default.Execute(Procedure
begin
MachewasLanges;
end;
end;
Bedeutet die App ist sofort wieder im MainThread und kann die ganze UI aufbauen... Und wenn alles fertig ist meine Routine aufrufen...
So habe ich alles umgestellt...
Mavarik