Timer auslesen bzw. gestartet?
Timer auslesen bzw. gestartet?
Hi,
Gibt es eine Möglichkeit herauszufinden, ob ein Timer (AddWindowTimer) bereits gestartet wurde? (oder den Wert lesen?)
Hintergrund:
Beim Auftreten eines bestimmten Ereignisses muss ich 30Sek warten und dann eine Aktion ausführen (hier wird der Timer wieder gelöscht).
Um nun das ganze im "Hintergrund" laufen zu lassen, wollte ich das mit Events lösen.
Das Problem: Das initiale Ereignis kann mehrmals auftreten, wobei aber nur das ERSTE Ereignis den Timer triggern soll.
Als Workaround muss ich die Info, dass der Timer läuft, in eine Variable packen.. :-/
Gibt es eine Möglichkeit herauszufinden, ob ein Timer (AddWindowTimer) bereits gestartet wurde? (oder den Wert lesen?)
Hintergrund:
Beim Auftreten eines bestimmten Ereignisses muss ich 30Sek warten und dann eine Aktion ausführen (hier wird der Timer wieder gelöscht).
Um nun das ganze im "Hintergrund" laufen zu lassen, wollte ich das mit Events lösen.
Das Problem: Das initiale Ereignis kann mehrmals auftreten, wobei aber nur das ERSTE Ereignis den Timer triggern soll.
Als Workaround muss ich die Info, dass der Timer läuft, in eine Variable packen.. :-/
Never change a running system - Never run a changed system!
(PB 6.21 [x86])
(PB 6.21 [x86])
Re: Timer auslesen bzw. gestartet?
Das ist nicht nur ein Workaround.techniker hat geschrieben:Als Workaround muss ich die Info, dass der Timer läuft, in eine Variable packen.. :-/
Picard würde sagen : "Machen Sie es so !"
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom
Re: Timer auslesen bzw. gestartet?
Wenn ich zwei Timer mit demselben Timerwert erstelle, dann wird bei mir immer nur ein Timer-Event pro eingestellte Zeit ausgelöst.
Also wenn ich beispielsweise 2x AddWindowTimer(0, 123, 1000) aufrufe, wird das Event trotzdem nur einmal und nicht doppelt ausgelöst. Oder meinst du was anderen?
Also wenn ich beispielsweise 2x AddWindowTimer(0, 123, 1000) aufrufe, wird das Event trotzdem nur einmal und nicht doppelt ausgelöst. Oder meinst du was anderen?
Re: Timer auslesen bzw. gestartet?
Das ist richtig.
Bei mir verhält es sich jedoch so, dass der Timer nachtriggert.
Hierdurch starten die 30Sek immer wieder erneut..
Ergebnis: Das 30Sek-Event tritt nie ein.
Bei mir verhält es sich jedoch so, dass der Timer nachtriggert.
Hierdurch starten die 30Sek immer wieder erneut..
Ergebnis: Das 30Sek-Event tritt nie ein.
Never change a running system - Never run a changed system!
(PB 6.21 [x86])
(PB 6.21 [x86])
Re: Timer auslesen bzw. gestartet?
Kannst du einen kleinen lauffähigen Beispielcode schreiben und posten zum Nachvollziehen deines Problems?
Danke im Voraus.
Danke im Voraus.
Re: Timer auslesen bzw. gestartet?
Das ist etwas schwierig, da die Ereignisse von extern (RS232) kommen.
Nochmal kurz zusammengefasst als zeitlicher Verlauf:
[RS232-Event] -> Jetzt sollen die 30Sek starten!
[RS232-Event] -> Ignorieren
[RS232-Event] -> Ignorieren
[RS232-Event] -> Ignorieren
[RS232-Event] -> Ignorieren
[RS232-Event] -> Ignorieren
....
[30Sek-Event] -> Jetzt sind 30 Sek vorbei und ich führe die entsprechende Aktion aus.
Wenn ich nun bei jedem [RS232-Event] den Befehl AddWindowTimer aufrufe, startet der Timer immer wieder neu.
D.h. in meinem Fall (es kommen immer wieder mal [RS232-Event] rein), wird der [30Sek-Event] nie aufgerufen.
Ich mache es nun so, dass ich zusätzlich eine Variable definiert habe und prüfe, ob diese gleich 0 ist.
Wenn ja: Timer starten und Variable auf 1.
Im [30Sek-Event] setzte ich dann die Variable zurück und das ganze ist wieder "scharf".
Wäre schöner gewesen, wenn es eine Funktion wie IsTimer oder so geben würde..
Nochmal kurz zusammengefasst als zeitlicher Verlauf:
[RS232-Event] -> Jetzt sollen die 30Sek starten!
[RS232-Event] -> Ignorieren
[RS232-Event] -> Ignorieren
[RS232-Event] -> Ignorieren
[RS232-Event] -> Ignorieren
[RS232-Event] -> Ignorieren
....
[30Sek-Event] -> Jetzt sind 30 Sek vorbei und ich führe die entsprechende Aktion aus.
Wenn ich nun bei jedem [RS232-Event] den Befehl AddWindowTimer aufrufe, startet der Timer immer wieder neu.
D.h. in meinem Fall (es kommen immer wieder mal [RS232-Event] rein), wird der [30Sek-Event] nie aufgerufen.
Ich mache es nun so, dass ich zusätzlich eine Variable definiert habe und prüfe, ob diese gleich 0 ist.
Wenn ja: Timer starten und Variable auf 1.
Im [30Sek-Event] setzte ich dann die Variable zurück und das ganze ist wieder "scharf".
Wäre schöner gewesen, wenn es eine Funktion wie IsTimer oder so geben würde..
Never change a running system - Never run a changed system!
(PB 6.21 [x86])
(PB 6.21 [x86])
Re: Timer auslesen bzw. gestartet?
Du kannst doch auch so machen:
1. Einmaliges Hinzufügen deines Timers
2. Du fügst bei jedem RS232-Event deine neuen Daten in eine Queue.
3. Im Timer-Eventbereich schaust du, ob es neue Aufträge in der Queue gibt, die du abarbeitest. Wenn nicht, dann ist die Queue leer und wird ignoriert.
1. Einmaliges Hinzufügen deines Timers
2. Du fügst bei jedem RS232-Event deine neuen Daten in eine Queue.
3. Im Timer-Eventbereich schaust du, ob es neue Aufträge in der Queue gibt, die du abarbeitest. Wenn nicht, dann ist die Queue leer und wird ignoriert.
Re: Timer auslesen bzw. gestartet?
Das verstehe ich nicht.
In diesem Fall habe ich keinen Bezug mehr vom RS232-Event zu den 30Sek.
Über RS232 bekomme ich keine Daten, sondern nur ein "I" für Interrupt.
*JETZT* müssen die 30 Sek starten, bis die Aktion (Messwert erfassen) ausgeführt wird.
Was nützt mir hier eine Queue?
In diesem Fall habe ich keinen Bezug mehr vom RS232-Event zu den 30Sek.
Über RS232 bekomme ich keine Daten, sondern nur ein "I" für Interrupt.
*JETZT* müssen die 30 Sek starten, bis die Aktion (Messwert erfassen) ausgeführt wird.
Was nützt mir hier eine Queue?
Never change a running system - Never run a changed system!
(PB 6.21 [x86])
(PB 6.21 [x86])
Re: Timer auslesen bzw. gestartet?
Ah ok und warum entfernst du den alten Timer mit RemoveWindowTimer() nicht einfach?
Dann hast du immer die 30 Sekunden nach einem RS232-Event.
Ansonsten musst du mit einer Variable arbeiten.
Dann hast du immer die 30 Sekunden nach einem RS232-Event.
Ansonsten musst du mit einer Variable arbeiten.
Re: Timer auslesen bzw. gestartet?
Mache ich ja dann auch.
Mein Problem ist/war, dass ich nicht wusste ob der Timer schon läuft -> Fehlende Funktion IsTimer (oder so).
Bei wiederholtem Aufruf von AddWindowTimer triggert dieser (leider) nach.
Wenn die Funktion wenigstens eine Rückmeldung geben könnte, dass der Timer schon aktiv ist oder so..
Naja - Workarounds bestimmen nun mal das Leben..
Mein Problem ist/war, dass ich nicht wusste ob der Timer schon läuft -> Fehlende Funktion IsTimer (oder so).
Bei wiederholtem Aufruf von AddWindowTimer triggert dieser (leider) nach.
Wenn die Funktion wenigstens eine Rückmeldung geben könnte, dass der Timer schon aktiv ist oder so..
Naja - Workarounds bestimmen nun mal das Leben..
Never change a running system - Never run a changed system!
(PB 6.21 [x86])
(PB 6.21 [x86])

