Hilo de Python. El temporizador solo se repite una vez.

def On_Instrumentation_StartAnimation(): """ Syntax : On_Instrumentation_StartAnimation() Purpose : Fired if the animation is started Parameters : None """ print "----------------------------------------------------------------------------------------" localtime = time.asctime(time.localtime(time.time())) global start start = time.clock() print "The user entered Animation Mode at local time: ", localtime print("This data has also been written to 'c:\dSPACE71\cdlog\cdlog.txt'") threading.Timer(2, ExecuteDemo).start() ExecuteDemo() # Printing to the text file file1 = open('c:\dSPACE71\cdlog\cdlog.txt', 'a') file1.write("\n----------------------------------------------------------------------------------------") file1.write("\nThe user entered Animation Mode at local time: ") file1.write(localtime) file1.close() def ExecuteDemo() . . . Current_value = Current.Read() localtime = time.asctime(time.localtime(time.time())) print "The current reading at localtime:", localtime, "is", str(Current_value) + "." # Printing to the text file file1 = open('c:\dSPACE71\cdlog\cdlog.txt', 'a') file1.write("\n----------------------------------------------------------------------------------------") file1.write("\nThe current reading at localtime: ") file1.write(localtime) file1.write(" is: ") file1.write(str(Current_value)) file1.close() . . . 

Como es de esperar, puedo intentar repetir la función ExecuteDemo () cada 2 segundos después de llamar a la función StartAnimation. Pero mi problema aquí es que mi ExecuteDemo () solo se ejecuta dos veces. ¿Cómo puedo conseguir que se repita? ¿Me estoy perdiendo de algo?

De la documentación:

clase threading.timer

Un hilo que ejecuta una función después de que haya pasado un intervalo especificado.

Esto significa que Threading.Timer llamará a una función después de un período de tiempo específico. Y como habrás notado, solo se llama una vez. La solución aquí será tener el temporizador una vez más al final de la función ExecuteDemo(..) .

 def ExecuteDemo(): . . . threading.Timer(2, ExecuteDemo).start() 

En mi opinión, el método anterior es un poco ineficiente. Es como cada 2 segundos que se crea un nuevo hilo, y una vez que ejecuta la función, muere antes de crear el siguiente hilo.

Sugeriría algo como esto:

 def ExecuteDemoCaller(): #while True: # or something.. while someCondition: ExecuteDemo() time.sleep(2) 

De los documentos :

class threading.Timer ( intervalo , función , args = [], kwargs = {}) ¶ Cree un temporizador que ejecute la función con argumentos args y argumentos de palabras clave kwargs , después de que hayan transcurrido segundos de intervalo .

No pude encontrar nada acerca de llamar repetidamente a algo. Tal vez alguien más tenga una mejor respuesta, o quizás tengas que hacerlo a mano (lo que no sería demasiado difícil).

El temporizador no se repite. Simplemente puede configurar otro temporizador al final de su función de callback.

 class setInterval(threading.Thread): def __init__(self, interval, function, args=[], kwargs={}): threading.Thread.__init__(self) self.interval = interval self.function = function self.args = args self.kwargs = kwargs self.finished = threading.Event() self.flag_run = True def cancel(self): self.finished.set() def run(self): while self.flag_run: self.finished.wait(self.interval) if not self.finished.is_set(): self.function(*self.args, **self.kwargs) else: self.flag_run = False self.finished.set() 

Después de 10 minutos de lectura de “threading.py” uso este código