Frage

Ich bin mit Python und PyGTK. Ich habe Interesse an eine bestimmte Funktion ausgeführt wird, die Daten von einem seriellen Anschluss bekommt und speichert es, alle paar Minuten.

Derzeit bin ich mit dem Schlaf () Funktion 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)

Dieses Setup ermöglicht es mir, von der seriellen Schnittstelle Intervallen von 5 Minuten zwischen Lesen von Daten zu haben. Mein Problem ist, dass ich möchte in der Lage sein, meine Readserial () Funktion Pause zu haben, was auch immer auf alle 5 Minuten wird und in der Lage sein, die Dinge zu tun, die ganze Zeit, anstatt die time.sleep () Funktion zu verwenden.

Alle Vorschläge, wie dieses Problem zu lösen? Multithreading? Interrupts? Bitte beachten Sie, dass ich Python bin mit.

Danke.

War es hilfreich?

Lösung

nicht solche Schleife mit Schlaf Verwenden Sie, wird es gtk aus der Verarbeitung keine UI Ereignisse blockieren, verwenden Sie stattdessen 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

Andere Tipps

Das ist genau wie meine Antwort hier

Wenn die Zeit ist nicht kritisch, genau auf die Zehntelsekunde zu sein, verwenden Sie

glib.timeout_add_seconds(60, ..)

sonst wie oben.

timeout_add_seconds erlaubt es dem System-Timeouts zu anderen Veranstaltungen auszurichten, auf lange Sicht reduziert CPU Wakeups (vor allem, wenn das Timeout reocurring) und speichert Energie für den Planeten (!)

gtk.timeout_add erscheint veraltet zu sein, so sollten Sie verwenden

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

gobject.timeout_add( 60*1000, my_timer )

Versuch:

import wx
wx.CallLater(1000, my_timer)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top