Pregunta

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.

Actualmente, estoy usando la función sleep () en la biblioteca de tiempo. Para poder realizar el procesamiento, 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 readserial () pause lo que esté sucediendo cada 5 minutos y poder hacer cosas todo el tiempo en lugar de usar la función time.sleep ().

¿Alguna sugerencia sobre cómo resolver este problema? Multithreading? Interrupciones? Tenga en cuenta que estoy usando Python.

Gracias.

¿Fue útil?

Solución

No utilice dicho bucle con suspensión, bloqueará gtk para que no procese ningún evento de IU, en su lugar use el temporizador gtk, por ejemplo,

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

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

Otros consejos

Esto es exactamente como mi respuesta aquí

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

glib.timeout_add_seconds(60, ..)

más que arriba.

timeout_add_seconds permite que el sistema alinee los tiempos de espera con otros eventos, a largo plazo reduciendo las reactivaciones de la CPU (especialmente si el tiempo de espera es recurrente) y ahorre energía para el planeta (!)

gtk.timeout_add parece estar en desuso, por lo que debe usar

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

gobject.timeout_add( 60*1000, my_timer )

prueba:

import wx
wx.CallLater(1000, my_timer)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top