Laden...

Auf x Events pro Zeitspanne reagieren und Ausgabe entsprechend true/false setzen

Erstellt von Xyllan vor 3 Jahren Letzter Beitrag vor 3 Jahren 1.000 Views
X
Xyllan Themenstarter:in
3 Beiträge seit 2020
vor 3 Jahren
Auf x Events pro Zeitspanne reagieren und Ausgabe entsprechend true/false setzen

Hallo an alle!

Ich hoffe ich poste hier an der richtigen Stelle! Leider konnte ich via Suche keine passenden Informationen finden, oder ich hab die falschen Fragen gestellt...

Mein Vorhaben:
Ich möchte die "Events" als Schaltflanke (false zu true bzw. auch bei true zu true) zählen. Das soll aber nur für eine gewisse Zeitspanne gültig sein.

Beispiel:
Zeitspanne x = 10 Minuten;
Gut-Signal = false (keine Aktion notwendig);

Wenn in der Zeit x (vom ersten "Event = true" aus gesehen!), 3 mal ein "Event" statt findet, soll eine Ausgabe [true] erfolgen. Bei <3 [false], ergo gut.
Das Signal true oder false würde bei mir zyklisch gesendet werden (als input, alle 1-10 Sekunden), und könnte aber auch in der angegebenen Zeitspanne wechseln! Sollte aber 3 mal von false auf true, oder das true Signal wiederholt auftreten (in summe 3mal pro Zeitspanne) soll mein Ausgabe-Flag auf true gesetzt werden.

Ich habe leider keine Ahnung, wie ich so etwas umsetzen kann und bitte daher um eure kompetente Hilfe/Anregungen/Meinungen.

LG

4.931 Beiträge seit 2008
vor 3 Jahren

Hallo und willkommen,

ich denke, dafür würde sich eine Queue<T> gut eignen.
Du speicherst dir dadrin jeweils das "Event-Flag" zusammen mit dem aktuellen Zeitstempel und bei jedem Eintreffen eines Events löschst du zuerst alle älteren Einträge (> 10 min) und überprüfst dann für die aktuellen Queue-Elemente deine Bedingungen (evtl. auch in einem festen Zeittakt die älteren Elemente löschen).

Soll das Programm denn dauerhaft laufen (bzw. was passiert bei einem Ausfall) oder aber auch händisch neu gestartet werden können? Dann solltest du diese Daten auch speichern und neu einladen.

X
Xyllan Themenstarter:in
3 Beiträge seit 2020
vor 3 Jahren

Vielen Dank für deine Grüße und deine Antwort!

Ich werde dem Hyperlink folgen und eingehend Studieren. Vielen Dank dafür!

Zu deiner Frage:
Ich sollte wohl sagen, dass ich eine Art "Container Programmierung" mache.
Die Signale kommen von "extern". Schnittstellen-Kommunikation hab ich save. Das Prg soll non-stop laufen. Es wird in eine andere Software implementiert, welches als Windows-Dienst läuft. Bei Reboot oder ähnlichem, startet die Applikation selbständig neu.

16.807 Beiträge seit 2008
vor 3 Jahren

Dann hilft Dir eine InMemory Queue nicht so sehr, weil Du hier die Daten eben nicht gespeichert hast sondern diese flüchtig sind.

Stattdessen könntest Du einfach ein Redis verwenden.
Redis kann von Haus aus auch Data Expire / TTL, sodass automatisch alle Einträge zB nach 10 Minuten entfernt werden und Du nur das in der Queue hast, was "gültig" ist.

X
Xyllan Themenstarter:in
3 Beiträge seit 2020
vor 3 Jahren

Ich habe nun eine Lösung gefunden.
Ich verwende nun ein Array, welches mit dem DataTime.now gefüttert wird. Auch habe ich einen counter, der schaut wieviele Signale mit "true" rein kommen. Letzt endlich subtrahiere ich [1] mit [0] und vergleiche es mit meiner Vorgabe von 10 Minuten (wenn Counter==2). Ist das Ergebnis außerhalb der range, wird der TimeStamp[1] in [0] geschrieben, der Counter wird auf 1 gesetzt, und wenn nicht, wird beim nächsten trigger [2] beschrieben, mit [0] subtrahiert und wieder mit der Vorgabe verglichen. Hierbei hat mein Counter dann den Wert 3. Ist es innerhalb der Zeitspanne, dann Alarm, [2]wird zu [1], [1]wird zu [0], counter = 2.
Ist es außerhalb, kein Alarm, Array wird umgeschrieben, wieder berechnet usw...
Was haltet ihr davon?
Soll/Darf ich den Quellcode komplett posten?