2016-12-06 2 views
1

Ich lerne Python zum Spaß und was ich hier erreichen möchte, ist ein Programm, das ständig Benutzer zur Eingabe durch eine While True Schleife fragt, während noch andere Skripte auf Hintergrund laufen (Vom Benutzer ausgewählt).Python: Ausführen eines Threads während der Benutzereingabe

Was ich zur Zeit habe funktioniert gut ... Aber nicht genau so, wie ich es wollte. Es nimmt die Eingaben des Benutzers und startet Threads wie gefragt, hält sie jedoch an, während er auf die nächste Eingabe des Benutzers wartet. Dann wird gedruckt, was mein Thread jede Sekunde drucken soll, aber nur einmal nach dem nächsten Druck der Konsole.

Ich benutze IDLE, um meinen Code regelmäßig zu testen, vielleicht könnte das helfen.

Haupt Skript:

from mythreadclass import MyThread 

while True: 
    user_input = input("What do I do ? ") 

    if user_input == "start thread": 
     #Will start a threat that prints foo every second. 
     mythread = MyThread() 
     mythread.start() 

    elif user_input == "hello": 
     print("Hello !") 

    else: 
     print("This is not a correct command.") 

Thread-Klasse:

import time 
from threading import Thread, Timer 

class MyThread(Thread): 
    def __init__(self): 
     Thread.__init__(self) 

    def run(self): 
     print("Thread started !") 
     while True: 
      self.foo() 
      time.sleep(1) 

    def foo(self): 
     print("foo !") 

Was habe ich, wenn Ausführung:

What do I do ? 
>>> start thread 
Thread started ! 
What do I do ? 
>>> hello 
foo !Hello ! 
>>> hello 
foo !Hello ! 

Wie Sie sehen können, sollte der Thread jede Sekunde foo! drucken, während der Benutzer noch nach der nächsten Eingabe gefragt wird. Stattdessen startet es den Thread und druckt foo ! nur, wenn der Benutzer etwas eingibt: Eingabe pausiert/blockiert den Thread.

Ich weiß nicht, ob das, was ich klar erreichen wollen ist so hier ist es:

What do I do ? 
>>> start thread 
Thread started ! 
What do I do ? 
foo ! 
foo ! 
foo ! 
#User waited 3 seconds before typing hello so there should be 3 foos 
>>> hello 
Hello ! 
What do I do ? 
foo ! 
foo ! 

etc etc. 
+0

ich geändert, dass '' input' zu raw_input' und es scheint alles wie erwartet zu funktionieren. Und ich lege alles in eine Datei. – sal

+0

Die Art, wie Sie es hier geschrieben haben, funktioniert perfekt für mich in Python 3.5. Ist das genau das, was du geschrieben hast oder ein Beispiel? –

+0

@JustinBell Es ist ein _ (sehr) _ vereinfachtes Beispiel, aber mein gesamtes Projekt ist global das gleiche (Eine Hauptklasse, die einen Thread in eine andere Datei umwandelt) – sohomangue

Antwort

-1

Du machst das Thema falsch. Statt unendlicher Rekursion, die run() Methode muss eine unendliche Schleife aussehen:

from threading import Thread 
import time 

class MyThread(Thread): 
    def __init__(self): 
     Thread.__init__(self) 
     self.start() 

    def run(self): 
     while (True): 
      self.foo() 
      time.sleep(1) 

    def foo(self): 
     print("foo !") 

my = None 

while True: 
    user_input = raw_input("What do I do ? ") 

    if user_input == "start thread": 
     #Will start a threat that prints foo every second. 
     if my == None: 
      print("Starting thread...") 
      my = MyThread() 
     else: 
      print("Thread is already started.") 

    elif user_input == "hello": 
     print("Hello !") 

    else: 
     print("This is not a correct command.") 
+0

Es ist wahrscheinlich wahr, dass unendliche Rekursion irgendwann zu einem Problem führen wird (ein Stapelüberlauf, bequem genug: P), aber ich glaube nicht, dass das das unmittelbare Problem ist @sohangangue –

+0

Ich wusste nicht mit Timer unendlich war falsch, ich repariere das! Durch die Verwendung von 'time.sleep() 'wurde die Ausgabe jedoch nicht geändert. Das Programm wartet immer noch auf den nächsten Konsolendruck, um" foo! " anstatt es jede Sekunde zu drucken. – sohomangue

+0

Ich habe meinen Code so geändert, dass er für mich funktioniert, wie Sie es wollen. – Organis

Verwandte Themen