Quiero activar una función cada 0,5 segundos y poder iniciar, detener y restablecer el temporizador. No conozco demasiado cómo funcionan los hilos de Python y tengo dificultades con el temporizador de Python.
Sin embargo, sigo obteniendo RuntimeError: threads can only be started once
cuando ejecuto threading.timer.start()
dos veces. ¿Hay una solución para esto? Intenté aplicar threading.timer.cancel()
antes de cada inicio.
Pseudo código:
t=threading.timer(0.5,function)
while True:
t.cancel()
t.start()
python
python-3.x
python-2.7
usuario1431282
fuente
fuente
threading.Event
ywait
en lugar desleep
. Luego, para despertarlo, simplemente configure el evento. Ni siquiera necesita elself.stopped
entonces porque solo verifica la bandera del evento.event.wait
solo se agotaría y actuaría como un sueño, pero si quisiera detener (o interrumpir el hilo), establecería el evento del hilo y se despertaría inmediatamente.thread.start()
me dathreads can only be started once
De Equivalente de setInterval en Python :
Uso:
O esta es la misma funcionalidad pero como una función independiente en lugar de un decorador :
A continuación, le indicamos cómo hacerlo sin utilizar hilos .
fuente
@setInterval(1)
.stop = repeat(every=second, call=your_function); ...; stop()
.stop = call_repeatedly(interval, your_function); ...; stop()
implementaciónUsando hilos de temporizador
esto puede ser detenido por
t.cancel()
fuente
cancel
método. Cuando se llama a esto, el hilo 1) no se está ejecutando o 2) se está ejecutando. En 1) estamos esperando ejecutar la función, por lo que cancelar funcionará bien. en 2) estamos ejecutando actualmente, por lo que cancelar no tendrá ningún efecto en la ejecución actual. además, la ejecución actual se reprograma a sí misma para que no tenga ningún efecto en el futuro.Mejorando un poco la respuesta de Hans Then , podemos simplemente subclasificar la función Timer. Lo siguiente se convierte en nuestro código completo de "temporizador de repetición", y se puede usar como un reemplazo directo para el subproceso. Temporizador con los mismos argumentos:
Ejemplo de uso:
produce la siguiente salida:
y
produce
fuente
RuntimeError: threads can only be started once
.threading.py
módulo en sí.Con el interés de proporcionar una respuesta correcta usando Timer como lo solicitó el OP, mejoraré la respuesta de swapnil jariwala :
fuente
He cambiado algo de código en el código swapnil-jariwala para hacer un pequeño reloj de consola.
Temporizador con interfaz gráfica tkinter
Este código coloca el temporizador del reloj en una pequeña ventana con tkinter
Un ejemplo de juego de tarjetas didácticas (más o menos)
salida:
fuente
Tuve que hacer esto para un proyecto. Lo que terminé haciendo fue iniciar un hilo separado para la función
**** El latido del corazón es mi función, el trabajador es uno de mis argumentos ****
dentro de la función de latido de mi corazón:
Entonces, cuando inicio el hilo, la función esperará repetidamente 5 segundos, ejecutará todo mi código y lo hará indefinidamente. Si desea matar el proceso, simplemente elimine el hilo.
fuente
He implementado una clase que funciona como temporizador.
Aquí dejo el enlace por si alguien lo necesita: https://github.com/ivanhalencp/python/tree/master/xTimer
fuente
Aquí hay una pequeña muestra, ayudará a comprender mejor cómo funciona. function taskManager () al final crea una llamada de función retrasada a sí misma.
Intente cambiar la variable "dalay" y podrá ver la diferencia
fuente
Me gusta la respuesta de right2clicky, especialmente porque no requiere que se elimine un hilo y se cree uno nuevo cada vez que el temporizador funciona. Además, es fácil anular la creación de una clase con una devolución de llamada de temporizador que se llama periódicamente. Ese es mi caso de uso normal:
fuente
Esta es una implementación alternativa que usa función en lugar de clase. Inspirado por @Andrew Wilkins arriba.
Porque esperar es más preciso que dormir (tiene en cuenta el tiempo de ejecución de la función):
fuente
Se me ocurrió otra solución con la clase SingleTon. Dígame si hay alguna pérdida de memoria aquí.
fuente