Question

J'utilise Python et PyGTK. Je suis intéressé par l'exécution d'une certaine fonction, qui récupère les données d'un port série et les enregistre toutes les quelques minutes.

Actuellement, j'utilise la fonction sleep () dans la bibliothèque de temps. Pour pouvoir effectuer le traitement, mon système est configuré comme suit:

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)

Cette configuration me permet d’avoir 5 minutes d’intervalle pour lire les données du port série. Mon problème est que j'aimerais pouvoir mettre ma fonction readserial () en pause toutes les 5 minutes et pouvoir faire des choses tout le temps au lieu d'utiliser la fonction time.sleep ().

Des suggestions sur la façon de résoudre ce problème? Multithreading? Des interruptions? N'oubliez pas que j'utilise python.

Merci.

Était-ce utile?

La solution

N'utilisez pas une telle boucle en mode veille, elle empêchera gtk de traiter les événements d'interface utilisateur, mais utilisera plutôt la minuterie gtk, par exemple.

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

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

Autres conseils

C’est exactement comme ma réponse ici

Si le temps n'est pas critique pour être exact au dixième de seconde, utilisez

glib.timeout_add_seconds(60, ..)

sinon comme ci-dessus.

timeout_add_seconds permet au système d'aligner les délais d'expiration sur d'autres événements, ce qui réduit à long terme les réveils de la CPU (surtout si le délai est récurrent) et économiser de l'énergie pour la planète (!)

gtk.timeout_add semble être obsolète, vous devriez donc utiliser

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

gobject.timeout_add( 60*1000, my_timer )

essayez:

import wx
wx.CallLater(1000, my_timer)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top