util.Timer zu langsam?

  • Themenstarter Themenstarter Boha
  • Beginndatum Beginndatum
B

Boha

Gast
Hi,
ich bin gerade dabei einen Autonomen Rasenmäher zu Programieren und Simulieren.
Die Simulation läuft ausschließlich über Timer.
Je nachdem in welche Richtung sich ein Radmotor dreht wird die Position auf der karte über einen Timer aktualisiert.
Dadurch lässt sich auch die Geschwindigkeit der Simulation einstellen.
Mein Problem ist jetzt, dass die Simulation mit einem Intervall von zB 10ms mal schneller und mal langsamer läuft.
Mir kommt es so vor, je länger mein PC läuft umso schneller bzw. "normaler" laufen auch die Timer.. nach einem Neustart läuft die ganze Simulation im Schneckentempe..
Hat vll jemand eine Idee woran das liegt?
LG
 
Prinzipiell muss man bei einem Multitasking-Betriebssystem (sofern es sich nicht um ein Echtzeitbetriebssystem handelt) damit rechnen, dass eine Anwendung für beliebig lange Zeit unterbrochen wird, weil das System gerade etwas anderes zu tun hat. Direkt nach dem Neustart werden oft noch irgendwelche Dienste etc. gestartet, was das System etwas ausbremst.

Wenn man Timer.schedule verwendet, dann verwendet man fixed-delay-execution, so dass zwischen zwei Ausführungen immer wieder 10ms vergehen; evtl. aus länger, wenn das System anderweitig zu tun hatte.

Mit Timer.scheduleAtFixedRate benutzt man fixed-rate-execution, so dass der Timer versucht, auf lange Sicht die Frequenz aufrechtzuerhalten. Wenn der Timer also bemerkt, dass seit der letzten Ausführung bereits 25ms vergangen sind (weil z.B. zwischendurch das System durch eine GarbageCollection ausgebremst war), dann führt er den Task zweimal direkt hintereinander aus und plant den nächsten nur 5ms später ein; er versucht also sozusagen, die Verspätung aufzuholen.

Verwendest Du bereits fixed-rate-execution?
 
ist unterschiedlich..
ein Task erledigt die Positionsbestimmung, abhängig von Drehrichtung der Radmotoren und Richtung des Rasenmähers.
Andere Tasks werden gestartet um zu vergleichen, ob zB ein bestimmter Punkt oder Richtung erreicht wurde. Dadurch das diese nicht aneinander gekoppelt sind kommt es manchmal zu Problemen weil bei einer Drehung 2mal die Richtung neu bestimmt wird und der Task der die gewollte Richtung mit der aktuellen vergleicht den Zeitpunkt verpasst hat. dann macht der Rasenmäher nochmal ne komplette Drehung.
bei der Positionsbestimmung die immer läuft hab ich jetzt nur Timer.schedule, damit er die aktualisierung nicht 2 mal direkt hintereinander durchführt und der andere Timer nicht hinterher kommt.
Bei den Vergleichstask benutze ich atFixedRate.
Die Vergleichstask werden auch in kürzeren Perioden ausgeführt.. trotzdem verpassen sie manchmal den richtigen Zeitpunkt, ist aber nicht so schlimm.

Danke schonmal, jetzt weiß ich wenigstens woran es liegt.
Kann man vll iwo die Priorität der einzelnen Timertasks im Programm festlegen?
LG
 
Ok, jetzt bin ich drauf gekommen, dass man auch mehrere Tasks an einen Timer hängen kann..
glaube das hilft mir weiter 🙂
 

Zurück
Oben