Seite 1 von 2
Verfasst: Mittwoch 29. Juli 2009, 10:56
von lunar
glaslos hat geschrieben:cofi hat geschrieben:glaslos hat geschrieben:quick and dirty

Sehr dirty. IMHO loest es auch gar nicht das Problem, da trotzdem auf die Eingabe gewartet wird.
Er möchte doch die Eingabe, jedoch mit Timeout. Sprich: Nach z.B. 2 Minuten soll das Programm mit der Nachricht: "Keine Eingabe" weiterlaufen.
Das tut dein Programm aber nicht, da "read()" blockierend ist.
Verfasst: Mittwoch 29. Juli 2009, 11:22
von ms4py
Verfasst: Mittwoch 29. Juli 2009, 11:29
von lunar
Das kann imho nicht richtig funktionieren. Der Code bricht die Funktion ja nicht ab, sondern lässt sie im Hintergrund weiterlaufen. Daher kann man in einem Programm exakt ein einziges Mal auf diese Weise eine Eingabe abfragen. Springt dann der Timeout an, bleibt die Standardeingabe durch den Thread blockiert. Jede weitere Eingabe geht also erstmal an die Funktion im Thread, und verschwindet damit faktisch im Nirvana.
Verfasst: Mittwoch 29. Juli 2009, 12:35
von Maks81
glaube ich habe ein lösung gefunden:
import sys
import threading
interaction=""
def input():
global interaction
interaction = sys.stdin.readline()
...
T = threading.Thread(target=input)
T.start()
T.join(120)
if interaction:
...
scheint zu funktionieren.
habe hier auch raw_input() nochmal ausprobiert, hat auch funktioniert
Verfasst: Mittwoch 29. Juli 2009, 13:09
von ms4py
Nein das funktioniert nicht, weil der Thread immer noch blockiert und somit den nächsten Input einfach dem Mainthread "klaut" (wie lunar schon beschrieben).
Versuch das mal mit subprocess zu implementieren, damit müsste es gehen.
Alternative Lösung mit thread
Verfasst: Mittwoch 29. Juli 2009, 18:32
von heribert
Hallo, ich habe das mit dem thread mal etwas anders programmiert. Auf Windows XP mit Python 2.6 funktioniert das.
Code: Alles auswählen
import threading
import time
Eingabe = None
class ReadText(threading.Thread):
def run(self):
global Eingabe
while True:
Eingabe = raw_input()
def warten(Wartezeit):
global Eingabe
Eingabe = None
Startzeit = time.time()
while Eingabe == None and (time.time() - Startzeit) < Wartezeit:
time.sleep(.1)
if Eingabe is not None:
print "Eingegeben wurde:", Eingabe
else:
print "Keine Eingabe erfolgt"
return Eingabe
w = ReadText()
w.daemon = True
w.start()
print "Warte 1"
e = warten(5)
print "Warte 2"
e = warten(10)
print "Ende"
Verfasst: Mittwoch 29. Juli 2009, 20:47
von birkenfeld
Maks81 hat geschrieben:intention error!?
Den hätt ich auch mal gern gehabt, der würde viele Bugs einsparen.
Verfasst: Donnerstag 30. Juli 2009, 09:44
von snafu
birkenfeld hat geschrieben:Maks81 hat geschrieben:intention error!?
Den hätt ich auch mal gern gehabt, der würde viele Bugs einsparen.
