InputListener(threaded) ohne Verwendung weiterer Module

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.
hector
User
Beiträge: 20
Registriert: Dienstag 3. Oktober 2006, 09:06

InputListener(threaded) ohne Verwendung weiterer Module

Beitragvon hector » Freitag 28. September 2007, 23:13

So, seit Wochen geistere ich hier im Forum herum und fand auch schon viele Antworten zu bestimmten Fragen. Zu einer Sache jedoch leider noch nicht. Und zwar würde ich gerne ein Programm schreiben, dass auf eine Eingabe wartet, aber im Hintergrund trotzdem weiterläuft. Mit raw_input() ist das nicht möglich, da dieses ja den Code erst weiterlaufen lässt, wenn die <ENTER>-Taste gedrückt wurde. Nun habe ich aber in pygame schon Einiges an Code gefunden, welches aufzeigt wie das funktionieren könnte. Und zwar ist die Idee, dass erst durch Tastendruck der Input aufgezeichnet wird, oder man jeden Tastendruck als Einzeleingabe behandelt. Also soetwas wie "if event.Tastendruck: bla ... else: sleep(2)" Das würde aber vorraussetzen, dass ich einen Tastendruck registriere. Und da würde ich gerne wissen, ob die Idee erst einmal grundsätzlich die Richtige für dieses Problem ist, und wie es dann in py zu realisieren ist. Ich könnte es mit pygame machen, aber ich würde gerne so wenig wie möglich noch weitere Module benutzen. Derzeit nur threading und time, mehr sollten es nach Möglichkeit nicht sein. Warum ich diesen Code brauche? Nunja, für meinen persönlichen Ehrgeiz, es wurmt mich, dass ich das noch nicht lösen konnte.

Code: Alles auswählen

import threading,time,sys

class SchreibFaden(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
   
    def run(self):
        while 1:
            self.input = raw_input() #hier muss natürlich dann die Eingabeprozedur rein
            print self.input
            sys.stdout.flush() #Erweiterung dank BlackJack
            time.sleep(5)
       


class TextFaden(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
   
    def run(self):
        while 1:
            print "ich bin hier"
            sys.stdout.flush() #Erweiterung dank BlackJack
            time.sleep(2)
       

if __name__=="__main__":
    thread1 = SchreibFaden()
    thread1.start()
    thread2 = TextFaden()
    thread2.start()


das habe ich jetzt mal in 5min hingeschmiert, obschon mir vorher schon klar war, dass mein raw_input() das gesamte Programm blockieren wird.
Zuletzt geändert von hector am Samstag 29. September 2007, 09:49, insgesamt 2-mal geändert.
BlackJack

Beitragvon BlackJack » Samstag 29. September 2007, 08:16

Dein Programm funktioniert schon so, vorausgesetzt die Ausgabe ist ungepuffert. Sonst sieht man die Ausgaben des Schreibers erst sehr spät, aber sie werden gemacht! Bau mal nach den ``print``\s ein ``sys.stdout.flush()`` ein.
hector
User
Beiträge: 20
Registriert: Dienstag 3. Oktober 2006, 09:06

Beitragvon hector » Samstag 29. September 2007, 09:46

Danke für die Antwort BlackJack. Ich habe deinen Rat befolgt und ein sys.stdout.flush() hinter jede Print-Anweisung gesetzt. Aber das löst das Problem nicht. Solange er auf die Eingabe wartet, läuft der andere Thread auch nicht weiter. Denn würde er das, bekäme ich nach einer langen Wartezeit sehr viele "Ich bin hier"-Meldungen untereinander. Ich bekomme aber immer nur soviel, wie der zweite Thread Zeit hat zu schreiben. Nämlich wenn Thread 1 im sleep-Modus steckt (sleep(5)). Die logische Konsequenz ist, dass der erste Thread den Zweiten blockiert. Oder irre ich mich jetzt?
Wie gesagt, das Ziel ist, dass immer eine Konsolennachricht kommt und der Code nicht bei der Eingabe hängen bleibt -_-

kann sein, dass ich auch das sdtout.flush() falsch benutzte, ich habe jedenfalls den Code im Eingangspost editiert/aktualisiert.
BlackJack

Beitragvon BlackJack » Samstag 29. September 2007, 10:07

Wie gesagt: Bei mir funktioniert der Quelltext wie gewünscht.
hector
User
Beiträge: 20
Registriert: Dienstag 3. Oktober 2006, 09:06

Beitragvon hector » Samstag 29. September 2007, 10:18

Ya, tut mir leid. Du hast recht, es funktioniert tatsächlich. Aber ich kam erst durch deinen letzten Hinweis darauf, dass es an der IDE liegen könnte - was es dann auch tat. Mein Wing IDE-Editor hat ja keine echte Konsole und ich las auch schon, dass es deswegen des Öfteren zu Konsolenproblemen kommen könnte. So hier geschehen. Vielleicht sollte ich einen anderen Editor nehmen, aber das gehört hier nicht her. Übrigens funktioniert es auf einer echten Konsole auch ohne das flush()
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Samstag 29. September 2007, 12:30

hector hat geschrieben:Mein Wing IDE-Editor hat ja keine echte Konsole

Hallo hector!

Willkommen im Python-Forum!

WingIDE -> Bearbeiten -> Einstellungen -> Debugger -> IO -> Externe Konsole verwenden.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
hector
User
Beiträge: 20
Registriert: Dienstag 3. Oktober 2006, 09:06

Beitragvon hector » Samstag 29. September 2007, 13:24

cool, danke für den Hinweis. Diese Konsole verhält sich leider genauso wie die vorher. Was ich allerdings nicht verstehe, weil das die gleiche Konsole ist, die man mit Doppelklick auf das Script startet. Wenn ich das Script mit Doppelklick starte, funktioniert alles reibungslos, aber aus WingIDE heraus nicht. ~.~ merkwürdig
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Samstag 29. September 2007, 18:06

hector hat geschrieben:merkwürdig

:K
http://halvar.at | Kleiner Bascom AVR Kurs

Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Sonntag 30. September 2007, 09:19

hector hat geschrieben:Was ich allerdings nicht verstehe, weil das die gleiche Konsole ist, die man mit Doppelklick auf das Script startet. Wenn ich das Script mit Doppelklick starte, funktioniert alles reibungslos, aber aus WingIDE heraus nicht. ~.~ merkwürdig

Dann nimm doch diese Konsole auch her - wie das etwa alle machen.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
hector
User
Beiträge: 20
Registriert: Dienstag 3. Oktober 2006, 09:06

Beitragvon hector » Sonntag 30. September 2007, 11:12

ya, nichts anderes hatte ich auch vor Bild, aber es wäre schon komfortabler gewesen, wenn diese Variante geklappt hätte.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Montag 1. Oktober 2007, 16:15

hector hat geschrieben:ya, nichts anderes hatte ich auch vor Bild, aber es wäre schon komfortabler gewesen, wenn diese Variante geklappt hätte.

Nunja, so groß ist der Unterschied nun auch nicht. Ich habe fast immer mehere Konsolen-Tabs offen, mit IPython, SSH-Verbindungen etc.
My god, it's full of CARs! | Leonidasvoice vs Modvoice

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]