Ich möchte alle 0,5 Sekunden eine Funktion auslösen und den Timer starten und stoppen und zurücksetzen können. Ich weiß nicht genau, wie Python-Threads funktionieren, und habe Probleme mit dem Python-Timer.
Ich bekomme jedoch immer wieder, RuntimeError: threads can only be started once
wenn ich threading.timer.start()
zweimal ausführe . Gibt es dafür eine Lösung? Ich habe versucht, mich threading.timer.cancel()
vor jedem Start zu bewerben .
Pseudocode:
t=threading.timer(0.5,function)
while True:
t.cancel()
t.start()
python
python-3.x
python-2.7
user1431282
quelle
quelle
threading.Event
undwait
anstelle vonsleep
. Um es aufzuwecken, stellen Sie einfach das Ereignis ein. Sie brauchen dasself.stopped
dann nicht einmal, weil Sie nur das Ereignisflag überprüfen.event.wait
würde das nur eine Zeitüberschreitung verursachen und sich wie ein Schlaf verhalten, aber wenn Sie den Thread stoppen (oder auf andere Weise unterbrechen) möchten, würden Sie das Ereignis des Threads festlegen und es würde sofort aufwachen.thread.start()
gibt mirthreads can only be started once
Aus dem Äquivalent von setInterval in Python :
Verwendung:
Oder hier ist die gleiche Funktionalität, aber als eigenständige Funktion anstelle eines Dekorateurs :
Hier erfahren Sie, wie Sie dies ohne Verwendung von Threads tun .
quelle
@setInterval(1)
.stop = repeat(every=second, call=your_function); ...; stop()
.stop = call_repeatedly(interval, your_function); ...; stop()
ImplementierungVerwenden von Timer-Threads
Dies kann durch gestoppt werden
t.cancel()
quelle
cancel
Methode. Wenn dies aufgerufen wird, läuft der Thread entweder 1) nicht oder 2). In 1) warten wir darauf, die Funktion auszuführen, so dass Abbrechen gut funktioniert. in 2) laufen wir gerade, so dass Abbrechen keine Auswirkung auf die aktuelle Ausführung hat. Darüber hinaus plant sich die aktuelle Ausführung neu, sodass sie in Zukunft keine Auswirkungen mehr hat.Wenn wir die Antwort von Hans Then ein wenig verbessern , können wir einfach die Timer-Funktion unterordnen. Das Folgende wird zu unserem gesamten "Wiederholungs-Timer" -Code und kann als Drop-In-Ersatz für Threading verwendet werden. Timer mit denselben Argumenten:
Anwendungsbeispiel:
erzeugt die folgende Ausgabe:
und
produziert
quelle
RuntimeError: threads can only be started once
.threading.py
Modul selbst gehen.Im Interesse einer korrekten Antwort mit Timer, wie vom OP angefordert, werde ich die Antwort von Swapnil Jariwala verbessern :
quelle
Ich musste das für ein Projekt tun. Am Ende habe ich einen separaten Thread für die Funktion gestartet
**** Herzschlag ist meine Funktion, Arbeiter ist eines meiner Argumente ****
innerhalb meiner Herzschlagfunktion:
Wenn ich den Thread starte, wartet die Funktion wiederholt 5 Sekunden, führt meinen gesamten Code aus und macht das auf unbestimmte Zeit. Wenn Sie den Prozess beenden möchten, beenden Sie einfach den Thread.
quelle
Ich habe einen Code im Swapnil-Jariwala-Code geändert, um eine kleine Konsolenuhr zu erstellen.
Timer mit tkinter Grafikschnittstelle
Dieser Code versetzt den Timer mit tkinter in ein kleines Fenster
Ein Beispiel für ein Kartenspiel (eine Art)
Ausgabe:
quelle
Ich habe eine Klasse implementiert, die als Timer funktioniert.
Ich lasse den Link hier, falls jemand ihn benötigt: https://github.com/ivanhalencp/python/tree/master/xTimer
quelle
Hier ist ein kleines Beispiel, das Ihnen hilft, besser zu verstehen, wie es läuft. Die Funktion taskManager () erstellt am Ende einen verzögerten Funktionsaufruf.
Versuchen Sie, die Variable "dalay" zu ändern, und Sie werden einen Unterschied feststellen können
quelle
Ich mag die Antwort von right2clicky, insbesondere, weil nicht jedes Mal, wenn der Timer tickt, ein Thread abgerissen und ein neuer erstellt werden muss. Darüber hinaus ist es einfach, eine Klasse mit einem Timer-Rückruf zu erstellen, der regelmäßig aufgerufen wird. Das ist mein normaler Anwendungsfall:
quelle
Dies ist eine alternative Implementierung, die Funktion anstelle von Klasse verwendet. Inspiriert von @Andrew Wilkins oben.
Weil das Warten genauer ist als das Schlafen (es berücksichtigt die Funktionslaufzeit):
quelle
Ich habe eine andere Lösung mit der SingleTon-Klasse gefunden. Bitte sagen Sie mir, ob hier ein Speicherverlust vorliegt.
quelle