Die Frage:
Gibt es sowas wie raw_input auf zeitliche Begrenzung? (Sprich, dass der 30sek. auf ne Antwort wartet und dann weitermacht?)
mfg
Noch ne Frage
-
- User
- Beiträge: 670
- Registriert: Sonntag 15. Januar 2006, 18:42
- Wohnort: Celle
- Kontaktdaten:
Unter Unix: zum Beispiel mit signal und SIGALARM (was nach 30 Sekunden ausgelöst wird), oder aber mittels eines selects auf sys.stdin mit Timeout 30 Sekunden, oder aber mittels eines busy-loops, in dem regelmäßig gepollt wird (auch Teil des select-Moduls) ob Eingabe auf sys.stdin vorhanden ist, und sys.stdin auf non-blocking gestellt ist.
Unter Windows: mit der msvcrt (also mit der Microsoft C-Runtime, die auch sowas ähnliches kann; da muß aber jemand antworten der von Windows mehr Ahnung hat).
So leid es mir tut, blackbird, mit Threads wird der liebe Mensch hier wenig anfangen können, da ein Thread leider in einem anderen Thread keine Exception (o.Ä.) schmeißen kann, um diesen zu animieren weiterzumachen. Zumindest würde mir spontan nix einfallen, wie man einen Timer-Thread hierzu benutzen könnte, da die Blockade durch IO nicht aufgehoben werden kann durch einen zweiten Thread (ohne dass Signals oder was ähnliches ins Spiel kommen).
Unter Windows: mit der msvcrt (also mit der Microsoft C-Runtime, die auch sowas ähnliches kann; da muß aber jemand antworten der von Windows mehr Ahnung hat).
So leid es mir tut, blackbird, mit Threads wird der liebe Mensch hier wenig anfangen können, da ein Thread leider in einem anderen Thread keine Exception (o.Ä.) schmeißen kann, um diesen zu animieren weiterzumachen. Zumindest würde mir spontan nix einfallen, wie man einen Timer-Thread hierzu benutzen könnte, da die Blockade durch IO nicht aufgehoben werden kann durch einen zweiten Thread (ohne dass Signals oder was ähnliches ins Spiel kommen).
--- Heiko.
-
- User
- Beiträge: 1790
- Registriert: Donnerstag 28. Oktober 2004, 16:33
- Wohnort: Graz, Steiermark - Österreich
- Kontaktdaten:
Joa. Stimmt.modelnine hat geschrieben:So leid es mir tut, blackbird, mit Threads wird der liebe Mensch hier wenig anfangen können, da ein Thread leider in einem anderen Thread keine Exception (o.Ä.) schmeißen kann, um diesen zu animieren weiterzumachen. Zumindest würde mir spontan nix einfallen, wie man einen Timer-Thread hierzu benutzen könnte, da die Blockade durch IO nicht aufgehoben werden kann durch einen zweiten Thread (ohne dass Signals oder was ähnliches ins Spiel kommen).
TUFKAB – the user formerly known as blackbird
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
Hi Ferox!Ferox hat geschrieben:(Sprich, dass der 30sek. auf ne Antwort wartet und dann weitermacht?)
Das ich das jetzt schreibe, dass hätte ich vor ein paar Wochen noch nicht geglaubt:
Muss es unbedingt eine Konsolenanwendung sein?
Wenn nicht, dann könntest du ein einfaches Fenster mit wxPython basteln. Damit dürfte sich das Problem von selber lösen.
mfg
Gerold
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
-
- User
- Beiträge: 670
- Registriert: Sonntag 15. Januar 2006, 18:42
- Wohnort: Celle
- Kontaktdaten:
Das ist Ansichtssache...Ja, da is doch schon was einfacheres^^, dankesehr
Ich selbst habe GUIs nie für einfacher gehalten als ein bisschen asynchrone Programmierung in der Kommandozeile, weil man bei GUIs ganz schnell in den Bereich kommt wo magisch Dinge passieren, die man nicht steuern/kontrollieren kann... Und sowas widerstrebt mir massivst. Wenn Du für Unix entwickelst, kann ich Dir trotzdem kurz mal Code schreiben der das ganze über ein Signal macht, wenn Du Interesse hast. Dann meld Dich einfach kurz.
--- Heiko.
Ich hätte schonmal Interesse und wahrscheinlich einige andere auch.modelnine hat geschrieben:.., kann ich Dir trotzdem kurz mal Code schreiben der das ganze über ein Signal macht, wenn Du Interesse hast. Dann meld Dich einfach kurz.
Ich hoffe das gilt dann auch
ubuntu linux !!
-
- User
- Beiträge: 670
- Registriert: Sonntag 15. Januar 2006, 18:42
- Wohnort: Celle
- Kontaktdaten:
Okay. Here we go:
Wichtig ist dabei einfach nur das Verbinden von signal.SIGALRM (das Alarm-Signal, was der Prozess bekommt) mit einer Python-Methode, die einen RuntimeError schmeißt, und eben das setzen, bzw. löschen des Alarms.
Ich bin mir momentan nicht sicher, aber ich würde vermuten, dass dieser Code relativ unverändert auf Windows laufen sollte; soweit ich weiß emuliert die libc unter Windows auch SIGALRM, zumindest gibt es dort auch ein signal-Modul.
Das ganze funktioniert nur wenn threading nicht präsent ist, da es ein ganz eigenes Problem ist welcher Thread des Prozesses das Signal behandelt in der Gegenwart von Threads; bei Python behandelt immer der Hauptthread das Signal, und damit nicht notwendigerweise der Thread in dem die Eingabe erwartet wird.
Wenn man das ganze in einem Thread haben will, muß man auf select() zurückgreifen; das ist aber dann nicht mehr so schön kurz und "einsichtig" wie hier.
Unabhängig davon: außer wenn ich tierisch im Stress bin, stehe ich auch dazu, dass wenn ich etwas angeboten habe, ich den entsprechenden Code auch schreibe...
Code: Alles auswählen
# -*- coding: iso-8859-15 -*-
import signal
def RaiseInterrupt(signo,stack):
raise RuntimeError("Ich wurde unterbrochen!")
# Schmeiße einen RuntimeError im aufrufenden Frame.
signal.signal(signal.SIGALRM,RaiseInterrupt)
# Kleine Methode die einen RuntimeError schmeißt mit dem Alarm verbinden.
signal.alarm(30) # Alarm in 30 Sekunden, so lange soll der Benutzer Zeit haben.
try:
data = raw_input("Bitte gib in 30 Sekunden was ein: ")
signal.alarm(0)
# Alarm abbrechen wenn Eingabe erfolgt; raw_input ist zurückgekehrt.
except RuntimeError, e:
# Geschmissenen Fehler abfangen, der ist auf jeden Fall vom Typ RuntimeError
print # Leerzeile, da raw_input() keine neue Zeile geschrieben hat.
print "Ausnahme:", str(e)
print "Es wurde ein Abbruch geworfen, also sind die Daten nicht da!"
data = "Wurde abgebrochen!"
else:
print "Du hast eigegeben:", repr(data)
print "Data danach:", repr(data)
Ich bin mir momentan nicht sicher, aber ich würde vermuten, dass dieser Code relativ unverändert auf Windows laufen sollte; soweit ich weiß emuliert die libc unter Windows auch SIGALRM, zumindest gibt es dort auch ein signal-Modul.
Das ganze funktioniert nur wenn threading nicht präsent ist, da es ein ganz eigenes Problem ist welcher Thread des Prozesses das Signal behandelt in der Gegenwart von Threads; bei Python behandelt immer der Hauptthread das Signal, und damit nicht notwendigerweise der Thread in dem die Eingabe erwartet wird.
Wenn man das ganze in einem Thread haben will, muß man auf select() zurückgreifen; das ist aber dann nicht mehr so schön kurz und "einsichtig" wie hier.
Unabhängig davon: außer wenn ich tierisch im Stress bin, stehe ich auch dazu, dass wenn ich etwas angeboten habe, ich den entsprechenden Code auch schreibe...
--- Heiko.