2009-06-27 62 views
11

Estoy usando Python y PyGTK. Estoy interesado en ejecutar una determinada función, que obtiene datos de un puerto serie y los guarda, cada varios minutos.Ejecutar una función cada X minutos - Python

Actualmente, estoy usando la función sleep() en la biblioteca de tiempo. Con el fin de ser capaz de hacer el proceso, tengo mi sistema configurado de esta manera:

import time 
waittime = 300 # 5 minutes 
while(1): 
    time1 = time.time() 
    readserial() # Read data from serial port 
    processing() # Do stuff with serial data, including dumping it to a file 
    time2 = time.time() 
    processingtime = time2 - time1 
    sleeptime = waittime - processingtime 
    time.sleep(sleeptime) 

Esta configuración me permite tener intervalos de 5 minutos entre la lectura de datos desde el puerto serie. Mi problema es que me gustaría poder hacer que mi función read() pausa cualquier cosa que ocurra cada 5 minutos y pueda hacer cosas todo el tiempo en lugar de usar la función time.sleep().

¿Alguna sugerencia para resolver este problema? Multithreading? ¿Interrumpe? Tenga en cuenta que estoy usando Python.

Gracias.

Respuesta

23

No utilice dicho bucle con sleep, bloqueará a gtk para que no procese ningún evento de UI, en su lugar utilizará el temporizador gtk, p.

def my_timer(*args): 
    return True# do ur work here, but not for long 

gtk.timeout_add(60*1000, my_timer) # call every min 
+0

Gracias. Ese es el tipo de cosa que estaba buscando. – mouche

+4

Su devolución de llamada debe devolver 'True' o' False' para continuar o finalizar el evento. –

+2

La pregunta es antigua, pero si alguien necesita hacer esto en Gtk + 3, la función es 'GLib.timeout_add (delay, function, arg)' – arkocal

10

Ésta es exactamente igual my answer here

Si el tiempo no es crítico para ser exactos a la décima de segundo, utilizar

glib.timeout_add_seconds(60, ..) 

otra cosa que el anterior.

timeout_add_seconds permite que el sistema para alinear los tiempos de espera a otros eventos, en el largo plazo la reducción de despertadores de CPU (especialmente si el tiempo de espera se reocurring) y save energy for the planet (!)

+0

+1 para la nota de rendimiento. – saeedgnu

4

gtk.timeout_add parece estar en desuso, por lo se debe utilizar

def my_timer(*args): 
    # Do your work here 
    return True 

gobject.timeout_add(60*1000, my_timer) 
1

intento:

import wx 
wx.CallLater(1000, my_timer) 
+0

¿Podría dar más información sobre lo que está sucediendo aquí? –

Cuestiones relacionadas