Ich habe eine Hauptstoppuhr mit 4 Mini-Stoppuhren für jeden Schritt. Nach einer fertigen Zeit ist hier ein Beispiel, wie die Timer aussehen sollten:
%Vor% Die Mini-Timer sollten wie in diesem Fall zum Haupt-Timer addiert werden. Mit meinem aktuellen Timer scheint es immer .02
Millisekunden aus zu sein, also würden sie in diesem Fall 00 : 14 . 55
statt 00 : 14 . 57
addieren.
Hier ist ein JSFiddle meiner aktuellen Timer. Ich denke, das Problem ist höchstwahrscheinlich in der stopwatch.js
-Datei, aber ich bin mir nicht sicher, warum das der Fall ist, da ich Date.now()
verwende, um zu berechnen, wie viel Zeit vergangen ist. Hier ist die Datei stopwatch.js
, die der Code für eine individuelle Stoppuhr ist:
Ich habe alles innerhalb des oben erwähnten JSFiddle und auch in diesem gist , wenn das einfacher zu lesen ist. Jede Anleitung wäre willkommen.
Sie sprechen von einer Verzögerung von 20 ms, die durch eine Reihe von Dingen verursacht werden kann.
Date.now()
setInterval
driftet! Und hier ist ein Mülleimer, um es zu beweisen . Sie können nicht wirklich erwarten, dass eine Sprache, die auf einem einzigen Thread ausgeführt wird, Aufgaben alle 10ms mit perfekter Genauigkeit plant, und Ihre _update
-Methode verlangt genau das. Um dies richtig zu lösen, würde ich empfehlen, Ihre Lösung neu zu gestalten, so dass Sie alle Ihre Stoppuhren in eine StopwatchManager
umwandeln, die alle Ihre Stoppuhren gleichzeitig rendert und die Gesamtzeit für Ihre Hauptuhr berechnet, indem Sie die Zeiten der hinzufügen Miniuhren. Vielleicht möchten Sie auch mit requestAnimationFrame
für das Rendering arbeiten anstatt mit setInterval
.
Sie stoppen einen Timer und starten in der nächsten Zeile den nächsten. Ihr Problem ist teilweise, dass die Zeit zwischen diesen beiden Methodenaufrufen vergeht.
Auch Ihre 'stop'-Methode verwendet nicht einmal die aktuelle Zeit, sondern stoppt sie nur rückwirkend ab dem letzten Mal, wenn sie aktualisiert wurde, sie macht keine letzte _update
.
Wenn Sie möchten, dass es sich genau addiert, nehmen Sie Date.now()
in Ihrer updateMiniTimers
-Methode und übergeben Sie das an beide Aufrufe, um sicherzustellen, dass sie zum selben Zeitpunkt anhalten / starten und danach eine Endreinigung durchführen a stop
call.
Im Allgemeinen innerhalb der Methode:
%Vor%a und b sind absolut nicht garantiert gleich, kein Methodenaufruf ist augenblicklich.
Ich stimme mit Faraz über mögliche Ursachen überein. Ich würde auch nach Rundungsfehlern in den Divisionen suchen. Wie auch immer, wenn Sie es etwas robuster und skalierbarer machen möchten, könnten Sie Ihre Zeitpunkte als Elemente in einer Liste betrachten, die sich ständig erweitert. Immer wenn eine Stoppuhr startet, notieren Sie den Index des letzten Elements in der Liste als Startpunkt. Wenn Sie am Ende sind, zeichnen Sie den Index des letzten Elements als Endpunkt auf. Das würde Ihnen ermöglichen, genaue Hierarchien von Timern zu haben.
Tags und Links javascript timer stopwatch