2012-01-26 13 views
0

データベースから情報を再読み込みするように求めるサービスから非同期通知を受け取るユーザーインターフェイスがあります。非同期通知には、変更されたレコードの取得に使用できる主キーが含まれています。読み込み中は、1秒間に10〜15の通知が表示されることがありますが、IDが重複していることがよくあります。更新頻度の制限/更新キャッシュのパージ

{u'callback': u'job.modify', u'job-id': 1090, u'timestamp': u'2012-01-26 09:50:04.766'} 
{u'callback': u'job.modify', u'job-id': 1091, u'timestamp': u'2012-01-26 09:50:04.767'} 
{u'callback': u'job.modify', u'job-id': 1090, u'timestamp': u'2012-01-26 09:50:04.780'} 
{u'callback': u'job.modify', u'job-id': 1091, u'timestamp': u'2012-01-26 09:50:04.808'} 
{u'callback': u'job.modify', u'job-id': 1090, u'timestamp': u'2012-01-26 09:50:04.812'} 
{u'callback': u'job.modify', u'job-id': 1090, u'timestamp': u'2012-01-26 09:50:04.829'} 
{u'callback': u'job.modify', u'job-id': 1088, u'timestamp': u'2012-01-26 09:50:04.831'} 
{u'callback': u'job.modify', u'job-id': 1088, u'timestamp': u'2012-01-26 09:50:04.836'} 
{u'callback': u'job.modify', u'job-id': 1091, u'timestamp': u'2012-01-26 09:50:04.846'} 

このような場合、データベースの読み込みをスキップすることは価値があるようです。私はクラスで作業しているので、何らかのリフレッシュ間隔を設定することを考えました。これは私が今までに持っているものです:

class myClass(): 
    def __init__(self): 
    self.modified = set([]) 
    self.lastrefresh = datetime.datetime.now() 
    self.refreshinterval = datetime.timedelta(milliseconds = 250) 

    def onModify(self, data): 
    self.modified.add(data['job-id']) 
    if datetime.datetime.now() - self.lastrefresh < self.refreshinterval: 
     return 
    self.doModify() 

    def doModify(): 
    ids = list(self.modified) 
    self.lastrefresh = datetime.datetime.now() 
    self.modified.clear() 

ほとんどの場合、動作しますが、いくつかの更新が残っている可能性があります。これらの更新は非同期で受信されるため、表示される頻度や頻度がわかりません。保留中のリフレッシュは次回の通知で処理されますが、次の通知が適時に届かない場合は、変更したセットにIDが必要な250ミリ秒よりもずっと長く置かれます。どんな提案も大変ありがとうございます。

答えて

1

私はこの作業を行う方法を見つけたと思います。これは、クラスに以下のような変更を加える必要があります。

class myClass(): 
    def __init__(self): 
    self.modified = set([]) 
    self.lastrefresh = datetime.datetime.now() 
    self.refreshinterval = datetime.timedelta(milliseconds = 250) 

    def onModify(self, data): 
    self.modified.add(data['job-id']) 
    if datetime.datetime.now() - self.lastrefresh < self.refreshinterval: 
     return 
    self.doModify() 

    def doModify(): 
    if not self.modified: 
     return 
    ids = list(self.modified) 
    self.lastrefresh = datetime.datetime.now() 
    self.modified.clear() 
    wx.CallAfter(self.purgeModifies) 

    def purgeModifies(self): 
    wx.CallLater(250, self.doModify) 

それはwx.CallAfterを使用するために、少し陳腐に感じているし、すぐwx.CallLaterはC++アサーションエラーをスローすることを意味し、wx.CallLaterを呼び出しますが、onModifyは、バックグラウンドスレッドで起こっています。 wx.CallAfterは、メインスレッドに制御を返します。これにより、wx.CallLaterが機能します。これにより、保留中の更新を処理するための "もう一度実行する"ことができます。

関連する問題