Lade...
 

CX_TIMED_TRIGGER - Signal-Klasse

CX_TIMED_TRIGGER

Klassenhierarchie
Beschreibung:

Mit einem Objekt dieser Klasse können Aktionen verwaltet werden, die nicht sofort, sondern zu einem oder mehreren bestimmten Zeitpunkten ausgelöst werden sollen. Die Aktion besteht aus (jeweils optionalen) zwei Schritten und wird zum mit SetActionTerm gesetzten Zeitpunkt ausgelöst:

  1. Ein mit SetMsg oder SetStartEndMsg definiertes Start-Signal wird gesendet
  2. Ein mit SetEndMsg oder SetStartEndMsg definiertes End-Signal wird gesendet

Mit SetCycles kann die maximale Anzahl der gesendeten Signale zusätzlich fest vorgegeben werden. Falls sowohl Start-Message, als auch End-Message definiert sind, dann wird die Start-Message immer vor der End-Message gesendet.
Die gesendeten Messages werden immer mit den gleichen Parametern  auf dem Stack aufgerufen:

Position Typ Beschreibung
Top CX_NUMERIC Die fortlaufende Nummer der Message. Falls es sich um die zuletzt gesendete Message handelt, dann ist dieser Wert gleich TimesTriggered.
Top-1 CX_NUMERIC

Die in SetCycles eingestellte maximale Anzahl an Aktivierungen des CX_TIMED_TRIGGERS. Falls nichts eingestellt wurde, dann ist dieser Wert 0.

Top-2
194226

CX_TIMED_TRIGGER Das CX_TIMED_TRIGGER-Objekt, welches die Message gesendet hat.

Anwendungs-Beispiele:

  1. Nachbildung eines Weckers   
  2. Anstoßen eines zyklischen Backup   
  3. Um 12.00 Uhr Umstellen von "Kommen" auf "Gehen" an einem Gleitzeitterminal
Code-Beispiel:
Msg(COUNT_DOWN) Var(timedTrigger, dateTime) CreateTransObject(CX_TIMED_TRIGGER) -> timedTrigger // Define and set moments for sending a message CreateTransObject(CX_DATETIME) -> dateTime CreateTransObject(CX_PERIODIC_SPAN_TIME) dateTime Link(time) "1 min" dateTime Put(time.frequency) 1 dateTime Put(time.validEnum) // 0 = " from/until", 1 = "from", 2 = "until", 3 = "unlimited" dateTime timedTrigger Call(SetActionTerm) // Set message to be sent (COUNT_DOWN) timedTrigger Call(SetMsg) // Activate trigger timedTrigger Call(Activate) Window(TestWin, 10, 50, 200, 100, "Time trigger") [ INITIALIZE: 10 timedTrigger Call(SetCycles) // .... further statements COUNT_DOWN: -> triggerIndex // index of signals sent -> maxCycles // max. number of cycles set by SetCycles -> timedTrigger // the timed trigger object, which has send this message // .... further statements ] {}

 

Der TimeTrigger läuft in einem eigenen Thread. Dies bedeutet, dass er Nachrichten auch sendet, wenn der Hauptthread beschäftigt ist und die Nachrichten gar nicht bearbeiten kann. Die Nachrichten werden dann in eine Warteschlange gestellt, bis der Hauptthread wieder frei ist und werden dann empfangen. Hierdurch kann die gleiche Nachricht des TimeTrigger binnen kürzester Zeit relativ häufig empfangen werden. Durch folgenden Beispielcode wird nur die letzte Nachricht der aufgesammelten beachtet und die anderen ignoriert.

// create timed trigger
CreateTransObject(CX_TIMED_TRIGGER) -> timedTrigger
(TIME_TRIGGER_MESSAGE) timedTrigger Call(SetMsg)
CreateTransObject(CX_PERIODIC_SPAN_TIME, KEEP) -> tmpTime

// Set frequency in seconds
5s tmpTime Put(frequency)  // fire once every 5 seconds
3 tmpTime Put(validEnum)
tmpTime timedTrigger Call(SetActionTerm)

// Activate trigger
timedTrigger Call(Activate)

// Handling duplicate messages in the trigger message
TIME_TRIGGER_MESSAGE: Integer -> tmpIndex DropAll
                      // only execute the last message if there are more than one in the pipe
                      timedTrigger Call(TimesTriggered) tmpIndex > if return
 

 

Warum Start- & End-Message?

Die End-Message ist noch ein überbleibsel aus einem älteren Design der CX_TIMED_TRIGGER-Klasse, die es auch ermöglicht hat, zwischen den beiden Messages eine Methode auf einem Objekt aufzurufen. Der Aufruf wurde jedoch parallel ausgeführt, was aufgrund der fehlenden Synchronisationsmechanismen in InstantView höchst kritisch war und das da das Objekt auch nicht vor der GarbageCollection geschützt wurde, wurde der Mechanismus deaktiviert. Da die End-Message parktisch obsolet ist, wird sie in nächster Zukunft ebenfalls aus dem Interface entfernt.

Methodenverzeichnis (MDI)
Funktion MA* Parameter Rückgabe Kurzbeschreibung
Activate     INTEGER Aktivieren des Triggers
Deactivate       Deaktivieren des Triggers ohne Zurücksetzen der Anzahl an bereits gesendeten Signalen
DisableMsg       Zurücksetzen aller zu sendenden Messages
GetActionTerm     OBJECT Zeitpunkt, an denen ein Signal gesendet werden soll
GetCycles     INTEGER Ausgabe der maximalen Anzahl von durchzulaufenden Perioden. Wenn Null ist keine Vorgabe gemacht.
IsActive     INTEGER Prüfung, ob Trigger aktiv ist
ResetTriggered       Deaktivieren des Triggers mit Zurücksetzen der Anzahl an bereits gesendeten Signalen
SetActionTerm   OBJECT   Setzen des/der Zeitpunkts/e, an welchem ein Signal gesendet werden soll
SetCycles   INTEGER   Feste Vorgabe der maximalen Anzahl von durchzulaufenden Perioden
SetEndMsg   INTEGER   Setzen der zu sendenden End-Message
SetMsg   INTEGER   Setzen der zu sendenden (Start-)Message
SetStartEndMsg   INTEGER, INTEGER   Setzen der zu sendenden (Start-)Message und End-Message
TimeToNextEvent     CX_VALUE  Zeitpunkt zum nächsten Signal
TimesTriggered       Anzahl an bereits gesendeten Signalen
Diagnostics       Information über den aktuellen Zustand des Timed Triggers - für Testzwecke implementiert
GetDomain   CX_CLASS INTEGER Liefert die Domain des Objektes

 

 

Verwendung in AppsWH
Modul Kurzbeschreibung
AppsWH\Evaluate\qm\timedTrigger_qm.mod Modul zum Testen der Funktionalität