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

Noch ne Frage

Beitragvon Ferox » Montag 17. April 2006, 17:05

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

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

Beitragvon mitsuhiko » Montag 17. April 2006, 18:20

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

Beitragvon Ferox » Montag 17. April 2006, 18:29

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:

Beitragvon modelnine » Montag 17. April 2006, 18:59

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.
Benutzeravatar
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Beitragvon mitsuhiko » Montag 17. April 2006, 19:38

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

Beitragvon Ferox » Montag 17. April 2006, 19:40

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:

Beitragvon modelnine » Montag 17. April 2006, 19:42

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

Re: Noch ne Frage

Beitragvon gerold » Montag 17. April 2006, 20:03

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

Beitragvon Ferox » Montag 17. April 2006, 20:06

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

Beitragvon modelnine » Montag 17. April 2006, 20:09

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

Beitragvon icepacker » Montag 17. April 2006, 21:53

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:

Beitragvon modelnine » Montag 17. April 2006, 22:13

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.

Wer ist online?

Mitglieder in diesem Forum: Majestic-12 [Bot]