Re: Timerüberlauf Kategorie: Programmierung (von nitram - 30.06.2009 7:10) | ||
Als Antwort auf Re: Timerüberlauf von Detlef - 29.06.2009 20:48 | ||
| ||
> > > Hallo, > > > ich habe mal eine Frage zur Timervariable. > > > > > > Die Systemtimervariable ist vom Typ long und wird ca. alle 24 Tage überlaufen. Die Frage ist, wie geht > > > man mit dieser Variable nun um? Ich habe beispielsweise zyklische �berwachungen programmiert, > > > wo sich ein Proze� solange schlafen legt, bis system.timer() + X überschritten ist. Funktioniert auch > > > prima, gehe aber nun davon aus, da� in einem ünglücklichen Moment das Ganze auch mal > > > nach hinten losgehen kann. > > > Wie kann man diese Variable überhaupt sicher verwenden? ja kann man, warum auch nicht :-) > > > Kann man diese evtl. auch wieder zurücksetzen? ja kann man, macht aber keinen Sinn... > > Zurück setzen / verändern geht da nicht. > > > > Ich habe einen ähnlichen Anwendungsfall wie Du. Bei mir ist es eine Spannungsfrei Schaltung für > > Rolladenmotore. > > > > Ich habe eine zweite Variable (eigener Timer) genommen, welche im Sekundentakt hochgezählt wird. > > Diese benutze ich das als eigene Timer Variable. Um hier jetzt einen �berlauf zu verhindern, wird die > > eigene Timervariable immer um 4.00 Uhr zurückgesetzt. Die Wahrscheinlichkeit, das früh um 4.00 Uhr > > Rolläden bedient werden, ist bei mir unwahrscheinlich. Aber man könnte auch hier noch entgegen > > wirken, und den Rolladen Thread einfach um 4.00 aussetzen. > > > > Ob diese Lösung bei Dir anwendbar ist, weis ich nicht. Vielleicht hilfst irgendwie als Lösungsansatz. > > > > > > Rene > > Hallo Rene > vielen Dank für die Antwort. > inst ja mal interessant, ein Anwendungsfall des Threads mit dem Timer ist tatsächlich auch die > Jalantriebe wieder spannungsfrei zu schalten... > > Habe jetzt erstmal folgenden Lösungsansatz gewählt, frage mich aber, ob das nicht auch eleganter > geht. > > if (Aktzeit[a] <= system.timer() and Aktzeit[a]-360000000 < Aktzeit[a]) > or (((Aktzeit[a]-360000000) > system.timer()) and Aktzeit[a] > 360000000) > > Aktzeit[a] wird durch andere Funktionsteile gesetzt, und ist system.timer() + eine Wartezeit X. > > Normalerweise reicht ja der Vergleich > > Aktzeit[a] <= system.timer() > > um ein Ereignis auszulösen, aber wegen des Zählerumlaufs habe ich das um > > Aktzeit[a]-360000000 < Aktzeit[a] erweitert. Dieser Ausdruck bleibt nämich negativ, wenn > > Aktzeit[a] umgelaufen ist. > > Au�erdem wir sofort ausgelöst, wenn Aktzeit[a] - 100 Stunden immernoch grö�er ist als > system.timer() obwohl Aktzeit[a] schon grö�er ist als 100 Stunden. dann ist nämlich > system.timer() umgelaufen, und das Ereignis mu� sofort ausgelöst werden. Timerabfragen sollten eigentlich immer nach folgenden Schema ablaufen: long timer; timer=system.timer(); loop { ... if system.timer()-timer>=500 // Ist die Wartezeit von 500ms um?? { timer=system.timer(); // Timerwert speichern ... // mach etwas } } Solange der Datentyp vom Typ long sind, passiert nichts. nitraM | ||
Antwort schreiben Antworten: Re: Timerüberlauf (von Detlef - 30.06.2009 9:54) Re: Timerüberlauf (von Detlef - 30.06.2009 11:24) Re: Timerüberlauf (von Detlef - 30.06.2009 8:12) Re: Timerüberlauf (von Detlef - 30.06.2009 8:36) Re: Timerüberlauf (von nitram - 30.06.2009 8:30) Re: Timerüberlauf (von reneforster - 30.06.2009 15:01) Re: Timerüberlauf (von nitram - 30.06.2009 21:16) Re: Timerüberlauf (von Detlef - 30.06.2009 9:21) Re: Timerüberlauf (von Detlef - 30.06.2009 8:45) |