2009-06-27 5 views
11

Ich benutze Python und PyGTK. Ich interessiere mich für das Ausführen einer bestimmten Funktion, die Daten von einer seriellen Schnittstelle erhält und alle paar Minuten speichert.Führen Sie eine Funktion alle X Minuten - Python

Derzeit verwende ich die Funktion sleep() in der Zeitbibliothek. Um in der Lage zu sein, die Verarbeitung zu tun, ich habe mein System wie dies ein:

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) 

Diese Setup me 5-Minuten-Takt zwischen dem Lesen von Daten aus dem seriell Port haben kann. Mein Problem ist, dass ich möchte, dass meine Funktion "readserial() alle 5 Minuten pausiert, was vor sich geht, und dass ich ständig Dinge tun kann, anstatt die Funktion" time.sleep() "zu verwenden.

Irgendwelche Vorschläge zur Lösung dieses Problems? Multithreading? Interrupts? Bitte beachte, dass ich Python benutze.

Danke.

Antwort

23

Verwenden Sie keine solche Schleife mit Schlaf, es blockiert gtk von der Verarbeitung von UI-Ereignissen, stattdessen verwenden Sie GTK-Timer, z.

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

Dank. Das ist genau das, wonach ich gesucht habe. – mouche

+4

Ihr Rückruf muss "True" oder "False" zurückgeben, um das Ereignis fortzusetzen oder zu terminieren. –

+2

Die Frage ist alt, aber wenn jemand dies auf Gtk + 3 tun muss, ist die Funktion 'GLib.timeout_add (Verzögerung, Funktion, arg)' – arkocal

10

Das ist genau wie my answer here

Wenn die Zeit nicht kritisch ist exakt auf die Zehntelsekunde zu sein, sonst wie oben

glib.timeout_add_seconds(60, ..) 

zu verwenden.

timeout_add_seconds ermöglicht es dem System-Timeouts zu anderen Veranstaltungen auszurichten, auf lange Sicht CPU Wakeups reduziert (vor allem, wenn das Timeout reocurring) und save energy for the planet (!)

+0

+1 für Leistungshinweis. – saeedgnu

4

gtk.timeout_add veraltet zu sein scheint so Sie sollten

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

gobject.timeout_add(60*1000, my_timer) 
1

try:

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

Könntest du mehr darüber erzählen, was hier vor sich geht? –