Countdown

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
UweKI
User
Beiträge: 6
Registriert: Dienstag 10. September 2019, 15:44

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?
Benutzeravatar
__blackjack__
User
Beiträge: 13110
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
__deets__
User
Beiträge: 14540
Registriert: Mittwoch 14. Oktober 2015, 14:29

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
Antworten