Endlosschleife durch Benutzereingabe beenden

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
stugi82
User
Beiträge: 11
Registriert: Freitag 19. Oktober 2007, 14:16

Hallo!

Ich habe folgendes Problem: Ich möchte eine Endlosschleife durch eine Benutzereingabe von Außen zu einem beliebigen Zeitpunkt terminieren. Also z.B. wenn der Benutzer "q" für quit eingibt. Das ganze soll für eine beliebige Anzahl an Threads funktionieren.

Ich habe es erst mit raw_input() probiert. Da ist allerdings dann das Problem, dass er bei raw_input() wartet, bis der Benutzer etwas eingibt. Die Aktionen in der Endlosschleife sollen aber SOLANGE laufen, bis der Benutzer "q" eingibt. Hat jemand eine Idee?

Code: Alles auswählen


import threading
import time

class ThreadClass(threading.Thread):
    '''
    Class ThreadClass derived from threading.Thread.
    '''    

    def __init__(self):
        '''
        Constructor of class ThreadClass.
        '''
        # Initialisieren als Instanz der Klasse Thread
        threading.Thread.__init__(self)
        
        
    def run(self):
        '''
        Run method. 
        '''
        while True:
            userInput = raw_input("> ") 
            if userInput == "q": 
                break 
            
            print "Do something."
            # warte eine Sekunde
            time.sleep(1)


# Instanziieren und starten eines Threads  
firstThread = ThreadClass()
firstThread.start()

Danke!
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo!

Dann erstelle doch einfach _einen_ Thread der nur auf die Eingabe wartet. Wenn dieser ein "q" erhält, dann beendet er den/die anderen.

Die __init__-Methode kannst du in deinem Beispiel übrigens einsparen.
Das Leben ist wie ein Tennisball.
BlackJack

In dem Beispiel kann man sich die ganze Klasse sparen und einfach nur den Inhalt von `run()` in eine Funktion packen, die in einem `Thread` ausgeführt wird.

Und vor allem kann man sich sämtliche "docstrings" sparen die einfach nur das offensichtliche *nochmal* sagen. Mehrwert == Null. Gilt im Grunde auch für die Kommentare.

Die Endlosschleife könnte man übrigens auch so schreiben:

Code: Alles auswählen

    for user_input in iter(functools.partial(raw_input, '> '), 'q'):
        print 'Do something with', user_input
        time.sleep(1)
stugi82
User
Beiträge: 11
Registriert: Freitag 19. Oktober 2007, 14:16

Ok, ich sehe, ich habe die Frage, falsch formuliert. Was ich eigentlich suche, ist eine Alternative zu raw_input(), die nicht die Console benötigt. Also etwas vergleichbar mit Hot_Keys. Sowas wie "ALT+F4" für die Python Anwendung.
Aber ist letztendlich auch nicht so wichtig...

Das in dem Beispiel einiges unnötig bzw. überflüssig erscheint, ist mir auch klar. Das ist auch stark gekürzt und vereinfacht. Anscheinend nicht stark genug...[/quote]
Antworten