Noch ne Frage

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
Ferox
User
Beiträge: 48
Registriert: Dienstag 14. März 2006, 16:34

Die Frage:
Gibt es sowas wie raw_input auf zeitliche Begrenzung? (Sprich, dass der 30sek. auf ne Antwort wartet und dann weitermacht?)

mfg
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Einfache Antwort: Nein.
Du könntest dir mit threading und raw_input aber sowas basteln :wink:
TUFKAB – the user formerly known as blackbird
Ferox
User
Beiträge: 48
Registriert: Dienstag 14. März 2006, 16:34

Und wie tu ich sowas basteln? (ganz dumme Frage, aber ich weis die Antwort nich)
modelnine
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).
--- Heiko.
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

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).
Joa. Stimmt. :oops:
TUFKAB – the user formerly known as blackbird
Ferox
User
Beiträge: 48
Registriert: Dienstag 14. März 2006, 16:34

glp

sowas einfaches was man sich irgendwie mit sleep basteln kann gibts da nich?^^
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Nein. Leider nicht. Außer ich steh momentan gewaltig auf dem Schlauch... ;-)
--- Heiko.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Ferox hat geschrieben:(Sprich, dass der 30sek. auf ne Antwort wartet und dann weitermacht?)
Hi Ferox!

Das ich das jetzt schreibe, dass hätte ich vor ein paar Wochen noch nicht geglaubt: :shock:

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.
Ferox
User
Beiträge: 48
Registriert: Dienstag 14. März 2006, 16:34

Ja, da is doch schon was einfacheres^^, dankesehr
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Ja, da is doch schon was einfacheres^^, dankesehr
Das ist Ansichtssache... ;-)

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.
icepacker
User
Beiträge: 49
Registriert: Dienstag 15. November 2005, 18:48

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 hätte schonmal Interesse und wahrscheinlich einige andere auch.
Ich hoffe das gilt dann auch :lol:
ubuntu linux !!
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Okay. Here we go:

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)
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... ;-)
--- Heiko.
Antworten