Seite 1 von 1

Endlosschleife durch Benutzereingabe beenden

Verfasst: Mittwoch 13. Januar 2010, 13:17
von stugi82
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!

Verfasst: Mittwoch 13. Januar 2010, 13:45
von EyDu
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.

Verfasst: Mittwoch 13. Januar 2010, 14:04
von 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)

Verfasst: Donnerstag 14. Januar 2010, 09:12
von stugi82
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]