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.


Anmelden zum Antworten