Hallo zusammen,
für die Separierung von Aufgaben in Taksk möchte ich anonyme Methoden benutzen, und diese dann mit
kleinen Delays hintereinander ausführen.
Ich möchte einfach eine leicht zu handhabende Funktion um innerhalb von Actions und Events eine
Ausführung "Ohne externen Timer" zu starten, wenn man noch innerhalb der eigentlichen EventFunktion ist.
Ein Beispiel wäre FireMonkey TabControl -> OnTabChange. Wenn in der OnTabChange ein weiterer
TabChange ausgelöst werden soll wird das ignoriert, weil das nach Verlassen des EventFunktion wieder rückgesetzt wird.
Also müsste ich EventFunktion erst beenden lassen, und dann von ausserhalb den TabChange machen den ich möchte.
Ich habe einen ersten Versuch mit TTask und TTread.Synchronize gemacht, siehe hier:
Code:
// Procedure sequence of syncronized Tasks
// iDelay determines a delay before or after the Task, to separate external Events
// -iDelay means Delay before each Task, already before first
// +iDelay means Delay after each Task, the first is w/o delay
procedure Task_Sequence_SyncAndDelayed(iDelay : Integer; const aProcs : TS4Proc_Delegate_Array);
begin
TTask.Create(procedure ()
var
I : Integer;
tsk : ITask;
begin
for I := 0 to Length(aProcs)-1 do
begin
tsk := TTask.Create(procedure ()
begin
if iDelay < 0 then
Sleep(Abs(iDelay)); // xx milliseconds
TThread.Synchronize(nil, TThreadProcedure(aProcs[I]) ); //Interact with UI
if iDelay > 0 then
Sleep(Abs(iDelay)); // xx milliseconds
end).Start;
tsk.Wait();
end; // End loop
end).Start;
end;
Aufgerufen werden soll sas dann wie folgt: Es können mehrere Aufgaben hintereinandergeschaltet werden, falls nötig.
Code:
Task_Sequence_SyncAndDelayed(-500,
[
// 1st Task
procedure
begin
//Interact with UI
FFrmNotebook.ClearHeader( True );
ChangeTabActionViewNotebook.ExecuteTarget(ChangeTabActionViewNotebook);
end,
// 2nd Task, separated by Delay
procedure
begin
//Interact with UI
ChangeTabActionViewProject.ExecuteTarget(ChangeTabActionViewProject);
end
]);
Das scheint so zu funktionieren, aber ich bin nicht sicher ob es auch grundsätzlich in Ordnung ist das so zu machen.
Womöglich gibt es Probleme mit Delphi, Firemonkey, iOS, MAXOS, Android, etc.
Vielleicht gibt es ja auch schon eine Task-Queue die durch Delays getrennt wird, welche ich nicht gefunden habe.
Wäre schön eure Meinung dazu zu bekommen.
Rollo