CX_TIMED_TRIGGER
Klassenhierarchie
- CX_CLASS
- CX_TIMED_TRIGGER
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:
- Ein mit SetMsg oder SetStartEndMsg definiertes Start-Signal wird gesendet
- 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 |
CX_TIMED_TRIGGER | Das CX_TIMED_TRIGGER-Objekt, welches die Message gesendet hat. |
Anwendungs-Beispiele:
- Nachbildung eines Weckers
- Anstoßen eines zyklischen Backup
- 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.
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 |
Modul | Kurzbeschreibung |
---|---|
AppsWH\Evaluate\qm\timedTrigger_qm.mod | Modul zum Testen der Funktionalität |