Timer auslesen bzw. gestartet?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
techniker
Beiträge: 186
Registriert: 27.01.2016 11:08
Wohnort: BY

Timer auslesen bzw. gestartet?

Beitrag von techniker »

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.. :-/
Never change a running system - Never run a changed system!
(PB 6.21 [x86])
Benutzeravatar
Bisonte
Beiträge: 2474
Registriert: 01.04.2007 20:18

Re: Timer auslesen bzw. gestartet?

Beitrag von Bisonte »

techniker hat geschrieben:Als Workaround muss ich die Info, dass der Timer läuft, in eine Variable packen.. :-/
Das ist nicht nur ein Workaround.

Picard würde sagen : "Machen Sie es so !" :mrgreen:
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​​
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Timer auslesen bzw. gestartet?

Beitrag von RSBasic »

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?
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
techniker
Beiträge: 186
Registriert: 27.01.2016 11:08
Wohnort: BY

Re: Timer auslesen bzw. gestartet?

Beitrag von techniker »

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.
Never change a running system - Never run a changed system!
(PB 6.21 [x86])
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Timer auslesen bzw. gestartet?

Beitrag von RSBasic »

Kannst du einen kleinen lauffähigen Beispielcode schreiben und posten zum Nachvollziehen deines Problems?
Danke im Voraus.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
techniker
Beiträge: 186
Registriert: 27.01.2016 11:08
Wohnort: BY

Re: Timer auslesen bzw. gestartet?

Beitrag von techniker »

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..
Never change a running system - Never run a changed system!
(PB 6.21 [x86])
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Timer auslesen bzw. gestartet?

Beitrag von RSBasic »

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.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
techniker
Beiträge: 186
Registriert: 27.01.2016 11:08
Wohnort: BY

Re: Timer auslesen bzw. gestartet?

Beitrag von techniker »

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?
Never change a running system - Never run a changed system!
(PB 6.21 [x86])
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Timer auslesen bzw. gestartet?

Beitrag von RSBasic »

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.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
techniker
Beiträge: 186
Registriert: 27.01.2016 11:08
Wohnort: BY

Re: Timer auslesen bzw. gestartet?

Beitrag von techniker »

Mache ich ja dann auch. 8)

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.. :lol:
Never change a running system - Never run a changed system!
(PB 6.21 [x86])
Antworten