Stoppuhr mit anhalten / fortsetzen, ständig abrufbar
-
Hallo,
ich suche eine gute Möglichkeit, um eine Art Stoppuhr zu bauen, die ich auf Tastendruck anhalten und fortsetzen kann und deren Timer jederzeit von anderen Funktionen abrufbar sein soll.void Game::StartStopTurnTimer() { if (stop == false) { stopTime = SDL_GetTicks(); currentTime = stopTime - elapsedStoppedTime; stop = true; SDL_Log("STOP: startTime: %llu ms stopTime: %llu ms elapsedStoppedTime: %llu ms turnTime: %llu ms", startTime,stopTime,elapsedStoppedTime,currentTime); } else { startTime = SDL_GetTicks(); elapsedStoppedTime += startTime - stopTime; currentTime = startTime - elapsedStoppedTime; stop = false; SDL_Log("START: startTime: %llu ms stopTime: %llu ms elapsedStoppedTime: %llu ms turnTime: %llu ms", startTime, stopTime, elapsedStoppedTime, currentTime); } }I am to stupid to wrap my head around this.
- SDL_GetTicks() liefert ein Uint64 mit den Millisekunden seit Start der Applikation
- ich brauche die Startzeit des Timers (startTime)
- ich brauche die Stoppzeit des Timers (stopTime)
- ich muss die Zeiten addieren, in die der Timer gestoppt war
- während der timer läuft, möchte ich diesen Timer jederzeit z.B. mit
currentTime = SDL_GetTicks()- elapsedStoppedTime;ausrechnen können.
Das sollte doch passen, oder?
-
Ja thuering, denk einfach nächstes Mal 5 Minuten länger nach, bevor du für solch triviale Dinge hier einen Beitrag aufmachst!!!!!111
Ja, das passt soweit. Danke.
-
@thuering sagte in Stoppuhr mit anhalten / fortsetzen, ständig abrufbar:
denk einfach nächstes Mal 5 Minuten länger nach, bevor du für solch triviale Dinge hier einen Beitrag aufmachst!
Also, ich hatte durch den Monolog einen Erkenntniszugewinn. Thx.
-
@Lennox sagte in Stoppuhr mit anhalten / fortsetzen, ständig abrufbar:
Also, ich hatte durch den Monolog einen Erkenntniszugewinn. Thx.
Ja wenn das so ist: gern geschehen!
-
Vielleicht hilft dir das, habe ich in einem Board für Mikrocontroller gesehen, und leicht abgewandelt:
void loop() { static unsigned long t0 = millis(); static unsigned long timer = t0; const int refreshInterval = 300; if (millis() - timer >= refreshInterval) { timer += refreshInterval; int deciSeconds = (timer - t0) / 100; // 100 milliSeconds is equal to 1 deciSecond if (deciSeconds >= 100 * 10) { // Reset to 0 after counting for 100 seconds. t0 = timer; deciSeconds = 0; } sevseg.setNumber(deciSeconds, 1); } sevseg.refreshDisplay(); // Must run repeatedly }Normalerweise aktualisiert sich das Display in 100-ms-Abständen, aber ich wollte es mit 300ms etwas spannender machen...
Was ist besonders: Der timer muss nur einmal pro Runde gelesen (millis()) werden, aber nicht geschrieben.

Was passiert da eigentlich? Das ist ein Counter, der Sekunden und Dezisekunden (⅒-Sekunde) hochzählt, und ein 7 segment Display mit 4 digits aktualisiert.
-
Oh, Zeile 8 muss
timer = millis();sein, damit es genau wäre.