Einzelnen Beitrag anzeigen

Rollo62

Registriert seit: 15. Mär 2007
3.916 Beiträge
 
Delphi 12 Athens
 
#1

Ansatz für Task-Queue Sequenz

  Alt 17. Jun 2015, 10:55
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
  Mit Zitat antworten Zitat