Timer für readline

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.
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.
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Hier eine Thread-Variante:
http://code.activestate.com/recipes/473878/

Oder noch besser als Dekorator:
http://code.activestate.com/recipes/483752/
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.
Maks81
User
Beiträge: 4
Registriert: Dienstag 28. Juli 2009, 16:28

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
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

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.
heribert
User
Beiträge: 3
Registriert: Samstag 25. Juli 2009, 13:30
Wohnort: Gütersloh

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"
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Maks81 hat geschrieben:intention error!?
Den hätt ich auch mal gern gehabt, der würde viele Bugs einsparen.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

birkenfeld hat geschrieben:
Maks81 hat geschrieben:intention error!?
Den hätt ich auch mal gern gehabt, der würde viele Bugs einsparen.
:lol:
Antworten