Seite 1 von 1

Countdown

Verfasst: Dienstag 27. September 2022, 15:25
von UweKI
Hallo liebe Forum-Mitglieder,

ich hab mal eine Frage zu einem Format, zum Thema "Countdown"

Hier ist erstmal mein Code.

Code: Alles auswählen

import time

def countdown(num_of_secs):     

    zahl=0

    while num_of_secs:
        m, s = divmod(num_of_secs, 60)
        min_sec_format = '{:02d}:{:02d}'.format(m, s)
        zahl = zahl+1
        #print(min_sec_format,'=','Messung',zahl)
        print('Messung',zahl)
        for ms in range (1,10):
            print(ms,'ms')
        time.sleep(1)
        num_of_secs -= 1
        
    print('Countdown finished.')
    

inp = input('Input value: ')
countdown(int(inp))
Soweit klapp das ganz gut, aber ich möchte gerne meine Werte alle 10 Millisekunden abfangen. Wie bekomme ich das Format Millisekunden?

Re: Countdown

Verfasst: Dienstag 27. September 2022, 15:34
von __blackjack__
@UweKI: Na in dem Du nicht Sekunden runter zählst und wartest, sondern Hundertstelsekunden runter zählst und wartest. Und die Ausgabe muss dann auch entsprechend angepasst werden, weil Du die Hundertstelsekunden für die Umwandlung in eine Zeichenkette ja in drei Teile aufteilen musst: Minuten, Sekunden, Hundertstelsekunden.

Wobei, je höher die Auflösung, um so mehr fällt ins Gewicht, dass der Code zur Aufbereitung der Ausgabe ja auch Zeit benötigt, die beim `sleep()` nicht berücksichtigt wird, und das `sleep()` eine begrenzte Genauigkeit hat.

Re: Countdown

Verfasst: Dienstag 27. September 2022, 16:29
von __deets__
Das ist der uebliche Fehler beim warten. time.sleep wartet *mindestens* so lange wie angegeben. Tatsaechlich je nach Intervall, Platform, und Systemlast auch noch mehr. Und dieser Einfluss wird natuerlich auch immer relevanter, je kleiner das Interval wird, wie __blackjack__ schon sagte. Also macht man das so nicht, sondern so:

Code: Alles auswählen

period = 0.1 # 100ms
now = time.monotonic()
until = now + period * 100 # 10 Sekunden in der Zukunft
next = now + period # 
while next < until:
    time.sleep(next - time.monotonic())  # Gleicht Schwankungen ueber die Zeit aus
    next += period