2009-06-27 36 views
11

Sto usando Python e PyGTK. Sono interessato a eseguire una determinata funzione, che recupera i dati da una porta seriale e la salva, ogni pochi minuti.Esegui una funzione ogni X minuti - Python

Attualmente, sto utilizzando la funzione sleep() nella libreria di orari. Al fine di essere in grado di fare l'elaborazione, ho il mio sistema impostato in questo modo:

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) 

Questa configurazione mi permette di avere intervalli di 5 minuti tra la lettura dei dati dalla porta seriale. Il mio problema è che mi piacerebbe poter avere la mia funzione readserial() sospendere tutto ciò che accade ogni 5 minuti ed essere in grado di fare cose tutte le volte invece di usare la funzione time.sleep().

Qualche suggerimento su come risolvere questo problema? Multithreading? Interrupt? Si prega di tenere presente che sto usando Python.

Grazie.

risposta

23

Non utilizzare tale ciclo con sleep, bloccherà gtk dall'elaborazione di qualsiasi evento UI, invece di utilizzare il timer gtk ad es.

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

Grazie. Questo è solo il tipo di cosa che stavo cercando. – mouche

+4

Il callback deve restituire "True" o "False" per continuare o terimere l'evento. –

+2

La domanda è vecchia, ma se qualcuno ha bisogno di farlo su Gtk + 3, la funzione è 'GLib.timeout_add (delay, function, arg)' – arkocal

10

Questo è esattamente come my answer here

Se il tempo non è critico per la precisione al decimo di secondo, utilizzare

glib.timeout_add_seconds(60, ..) 

altro come sopra.

timeout_add_seconds consente al sistema di allineare timeout ad altri eventi, nel lungo periodo riducendo wakeups CPU (soprattutto se il timeout è reocurring) e save energy for the planet (!)

+0

+1 per la nota sulle prestazioni. – saeedgnu

4

gtk.timeout_add sembra essere obsoleto, così si dovrebbe usare

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

gobject.timeout_add(60*1000, my_timer) 
1

prova:

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

Potresti approfondire cosa sta succedendo qui? –

Problemi correlati