threading

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
Brevista
User
Beiträge: 32
Registriert: Sonntag 2. Juli 2017, 00:48

Hallo ich habe folgende Frage, ist es möglich zwei eingäbe also mit Input gleichzeitig ausgeben zu lassen. also das folgendes steht:

Stunden:

Minuten:

also das nicht einfach zuerst stunden eingegeben und dann Minuten eingegeben werden muss sondern beides zur gleichen zeit eingegeben kann.

ich könnte mir denken das es mit threading funktioniert, hat eine Lösung oder Tip?
__deets__
User
Beiträge: 14537
Registriert: Mittwoch 14. Oktober 2015, 14:29

Nein, das hat mit Threading nichts zu tun. Dein Terminal kann nur an einer Stelle Daten einlesen. Eine GUI uebrigens auch. Gleichzeitig geht also nicht. Entweder kannst du eine Eingabe machen, die beides enthaelt (also zB HH:MM als Muster vorgeben, bei dem die Eingabe dann am Doppelpunkt in Stunden und Minuten zerlegt wird), oder du liest es halt nacheinander ein.
Brevista
User
Beiträge: 32
Registriert: Sonntag 2. Juli 2017, 00:48

Das heißt so?

Code: Alles auswählen

import time

eingabe = input("Zeit >>")

zeit = eingabe.split(".")

zeit_minuten = int(zeit[0]) * 60

zeit_zusammen = int(zeit_minuten) + int(zeit[1])

while zeit_zusammen > 0:
    print(zeit_zusammen)
    zeit_zusammen = zeit_zusammen - 1
    time.sleep(1)
if zeit_zusammen == 0:
    print("GO")
Zuletzt geändert von Anonymous am Montag 31. Juli 2017, 21:38, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@Brevista: Ja, ungefähr so.

Da wird einmal zu oft `int()` aufgerufen und das ``if`` macht auch kaum Sinn. Das ist nur deshalb ”sinnvoll” weil der Benutzer auch negative Zeiten eingeben könnte. *Das* sollte er vielleicht besser nicht können.

Dafür wäre es vielleicht ganz praktisch wenn er auch nur die Sekunden eingeben könnte und nicht gezwungen wäre Minuten anzugeben wenn der Wert sowieso Null sein soll.

Der Doppelpunkt ist üblicher als Trenner. Und ich würde bei der Eingabeaufforderung einen Hinweis angeben in welchem Format die Zeiteingabe erwartet wird.

Im ersten Beitrag waren es noch Stunden und Minuten, und nun Minuten und Sekunden‽

Die ``while``-Schleife kann man als ``for``-Schleife ausdrücken. Wenn man vor Eintritt in eine Schleife schon bestimmen kann wie oft sie durchlaufen wird, dann ist das eigentlich immer ein Fall für eine ``for``-Schleife.

`time.sleep()` ist nicht genau, das heisst es kann etwas mehr, aber auch etwas weniger gewartet werden. Je öfter man das aufruft, um so mehr können sich solche Abweichungen akkumulieren. Je nach dem was man machen will, kann das eine Rolle spielen oder auch nicht. Sollte man auf jeden Fall im Hinterkopf behalten.
BlackJack

@Brevista: Da Du an anderer Stelle nach weiterem Vorgehen gefragt hast: Du könntest Deine bisherigen Programme durchgehen und schauen ob die auch alle ordentlich mit Falscheingaben klar kommen und der Code sinnvoll auf Funktionen aufgeteilt ist.

Wie gesagt kann der Benutzer bei Deinem Code auch negative Zahlen eingeben, was eher nicht sinnvoll ist. Und es wird auch nicht der Fall berücksichtigt, das der Benutzer kein Trennzeichen eingibt.

Ich habe das mal spasseshalber in QBasic implementiert, damit Du das bei Deinem Python-Code selbst machen kannst:
[codebox=qbasic file=Unbenannt.txt]' Maximale Minutenzahl die in Sekunden als Integer ausgedrückt werden können.
CONST MAX_MINUTES=2^15\60


FUNCTION AskDuration%
DO
Line Input "Dauer als Minuten:Sekunden";answer$
i%=InStr(answer$,":")
IF i% = 0 THEN
Print "Minuten und Sekunden müssen durch einen ':' getrennt werden!"
ELSE
minutes%=Val(Left$(answer$,i%-1))
seconds%=Val(Mid$(answer$,i%+1))
IF minutes% < 0 OR seconds% < 0 THEN
Print "Bitte nur positive Werte eingeben!"
ELSE
IF minutes% >= MAX_MINUTES THEN
Print "Minuten müssen kleiner";MAX_MINUTES;"sein!"
ELSE
totalSeconds%=minutes%*60+seconds%
IF totalSeconds% < 0 THEN
Print "Zu viele Sekunden gesamt!"
ELSE
EXIT DO
END IF
END IF
END IF
END IF
LOOP
AskDuration%=totalSeconds%
END FUNCTION


SUB PrintCountdown(seconds%)
FOR i%=seconds% TO 0 STEP -1
Print i%
Sleep 1
NEXT
Print "GO"
END SUB


PrintCountdown AskDuration()[/code]
In QBasic muss man auch noch prüfen ob die Sekundenzahl insgesamt nicht zu gross für den Datentyp `Integer` wird — bei Python gibt es bei `int` diese Beschränkung netterweise nicht. Wobei auch mit der vorzeichenbehafteten 16-Bit-Zahl in QBasic Countdowns über 9 Stunden möglich sind. :-)
Antworten