SOG-Helpcenter Logo SOG Business - Software

Verarbeitung in einem eigenen Thread


Für ActiveSkin DialogMasken gibt es zwei einfache Möglichkeiten, Verarbeitungen in einen eigenen Thread auszulagern.

 

Durch Auslagerung der Verarbeitung kann erreicht werden, dass nicht das gesamte ActiveSkin bis zum Ende der Verarbeitung blockiert wird, sondern dass nur die aktuelle Maske für Eingabe gesperrt wird, und nach dem Ende der Verarbeitung automatisch wieder zur Verfügung steht.

SOGGuiTask

 

Mit Hilfe einer SOGGuiTask kann eine Action an einen HandlerThread übertragen werden.

Bitte beachten Sie, dass die Action auf einem eigenen Thread, und in einer eigenen Transaktion ausgeführt wird.
Vermeiden Sie daher den Zugriff auf Daten, die sich während der Ausführung der Aktion über die Oberfläche ändern können.

 

  /// <summary>

  /// </summary>

  /// <param name="sender"></param>

  /// <param name="feargs"></param>

  public void SOGEventHandler_WerteNeuErmitteln(object sender, SOGFireEventArgs feargs)

  {

  SOGGuiTask task = new SOGGuiTask(_werteErmitteln);

  task.StatusText = TranslatedString.Translate("Werte werden ermittelt");

  feargs.Redirect = task.CreateRedirect();

 

In diesem Beispiel wird die Aktion "_werteErmitteln" auf einem eigenen Thread in einer eigenen Transaktion ausgeführt.

Folgende zusätzliche Eigenschaften stehen zur Verfügung:

 

StatusText

Text der während der Ausführung angezeigt werden soll.

UpdateMaskAfterExecution

true, wenn die Maske nach Beendigung der Ausführung aktualisiert werden soll.

LockMaskDuringExecution

true, wenn die Maske während der Ausführung blockiert werden soll. Standard ist "true".

 

RedirectAfterExecution

Redirect, der nach Ausführung ausgeführt werden soll. (Nur wenn keine Fehler aufgetreten sind).

 

SendMessageAfterExecution

Meldung die nach Ausführung geschickt werden soll. (Nur wenn keine Fehler aufgetreten sind).

 

WithCancellation()

Kann genutzt werden, um ein AbbruchToken zu erhalten oder zu setzen, mit dem die Action später abgebrochen werden kann. Damit die Action abbricht, muss sie das aktuelle Abbruchtoken beachten. (SOGTaskContext.CancellationToken)

 

CreateRedirect()

Erzeugt den Redirect, der an ActiveSkin übergeben werden muss, um die Verarbeitung einzuleiten

 

 

StartMaskJob


Zur Aktivierung dieser Funktion muss der Anwendungsentwickler eine Callback-Funktion schreiben, die die eigentliche Verarbeitung durchführt. Gestartet wird die Callback-Funktion über den Aufruf "StartMaskJob(CallBackFunktion);"
Hier ein vollständig implementiertes Beispiel, inklusive der Möglichkeit des vorzeitigen Abbruchs der Verarbeitung durch den Anwender (z.B. durch Schließen von ActiveSkin).


        bool abortWork = false;
        public void SOGEventHandler_Loop(object sender, SOGFireEventArgs feargs)
        {
            abortWork = false;

            for (int i = 1; i < 20; i++)
            {
                // Ausgabe eines Verarbeitungsstatus:
                v.WriteStatus(v.Format("Durchlauf {0}", i));


                //
                // Beispiel für die Aktualisierung eines Datenfeldes auf der Maske:
                m_email_betreff = v.Format("Durchlauf {0}", i);
                BufferToControls("m_email_betreff");

                //
                // Eigentliche Aktion:
                AppHelper.Sleep(1000);

                //
                // Programm Abbruch?
                if (abortWork)
                    return;
            }

            feargs.Redirect = new SOGRedirect("RETURN");
        }

        public void SOGEventHandler_LoopAsync(object sender, SOGFireEventArgs feargs)
        {
            StartMaskJob(SOGEventHandler_Loop);
        }

        public override void CloseLogical()
        {
            abortWork = true;
        }

Die Verarbeitungsfunktion wird in einer eigenen Transaktion ausgeführt. Durch Setzen von "feargs.Redirect" kann am Ende der Aktion auf eine Folgemaske gesprungen, oder die aktuelle Maske geschlossen werden.
Während der "Batchverarbeitung" können auch Datenfelder auf der Maske aktualisiert werden.
Gestartet wird das Beispiel durch Aufruf der EventFunktion "SOGEventHandler_LoopAsyn" z.B. über das Dialogschrittmenü.