2017-09-27 1 views
1

Im folgenden Beispiel druckt der Timer alle 5 Sekunden weiter hello world und hört niemals auf, wie kann ich den Timer-Thread als Timer verwenden (Drucken von "Hallo Welt"), aber auch nicht den Fortschritt des Programms stoppen?Python: Wie vermeidet man ein "Warten" in einem Thread, der den Fluss des Programms stoppt?

import threading 
class Timer_Class(threading.Thread): 
    def __init__(self): 
     threading.Thread.__init__(self) 
     self.event = threading.Event() 
     self.running = True 
    def run(self, timer_wait, my_fun, print_text): 
     while self.running: 
      my_fun(print_text) 
      self.event.wait(timer_wait) 

    def stop(self): 
     self.running = False 




def print_something(text_to_print): 
    print(text_to_print) 


timr = Timer_Class() 
timr.run(5, print_something, 'hello world') 
timr.stop() # How can I get the program to execute this line? 

Antwort

2

Vorweg: geändert False

while self.running: 

Ihr Code enthält eine Schleife, die self.running ist irgendwie, bis die Schleifenbedingung Looping halten.

Wenn Sie nicht loopen möchten, empfehle ich, dass Sie looping Teil in Ihrem Code entfernen.

Und dann: Sie sind nicht Aufruf start() auf Ihrem Thread-Objekt. Daher Sie aktuelle Code tut alles auf dem Hauptthread. Um wirklich mehr als einen Thread zu verwenden, müssen Sie irgendwann timr.start() anrufen!

So die echte Antwort hier: Schritt zurück lernen, wie Multi-Threading in Python funktioniert (zum Beispiel schauen Sie here). Es scheint, dass Sie einige Konzepte gehört haben und Versuch/Irrtum gehen. Und das ist eine sehr ineffiziente Strategie.

+0

Hallo der Code oben wurde von einer Stackoveflow-Frage https://Stackoverflow.com/a/9812806/157416 angenommen, die eine hohe Abstimmung zu haben scheint. Ich weiß, dass der Code eine Schleife erzeugt, die das gewünschte Ergebnis ist, aber durch Threading versuche ich, die Schleife vom Haupt-Thread zu trennen. Das OP fragt nach Möglichkeiten, dies zu erreichen. Ich werde mir den von Ihnen bereitgestellten Link ansehen. Aber deine Antwort beschreibt nur, was ich bisher schon weiß. Danke – Mohammad

+0

Und Sie verpassten den Aufruf ** start() **, der im Beispielcode vorhanden ist. Also von diesem Standpunkt aus: einfach einen Schritt zurück und überlegen, ob meine Antwort Ihr Problem gelöst hat, wenn ja, denken Sie freundlich über das Akzeptieren. Oder lassen Sie mich wissen, was fehlt, um dorthin zu gelangen. – GhostCat

+0

Ok, ich werde in den Start() Anruf schauen danke. – Mohammad

Verwandte Themen