質問

PythonとPyGTKを使用しています。シリアルポートからデータを取得して保存する特定の関数を数分ごとに実行することに興味があります。

現在、時間ライブラリの sleep() 関数を使用しています。処理を行えるようにするために、システムを次のように設定しました。

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)

この設定により、シリアル ポートからのデータの読み取り間隔を 5 分にすることができます。私の問題は、time.sleep() 関数を使用する代わりに、readserial() 関数で 5 分ごとに起こっていることを一時停止させ、常に処理できるようにしたいということです。

この問題を解決する方法について何か提案はありますか?マルチスレッド?中断しますか?Pythonを使用していることに注意してください。

ありがとう。

役に立ちましたか?

解決

睡眠と、このようなループを使用しないでください、それは使う代わりに、任意のUIイベントを処理することからGTKをブロックしますGTKタイマー例えばます。

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

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

他のヒント

これはまさにそのようなものです 私の答えはここにあります

時間が 10 分の 1 秒まで正確であることが重要でない場合は、次を使用します。

glib.timeout_add_seconds(60, ..)

それ以外は上記の通り。

timeout_add_秒 システムがタイムアウトを他のイベントに合わせて調整できるようになり、長期的には CPU ウェイクアップが減少します (特にタイムアウトが再発する場合)。 地球のためにエネルギーを節約する(!)

gtk.timeout_addは廃止されるように見えるので、あなたが使用する必要があります。

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

gobject.timeout_add( 60*1000, my_timer )

試してください:

import wx
wx.CallLater(1000, my_timer)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top