wxPython: wx.CallLater очень опаздывает

В моем приложении wxPython у меня есть обработчик EVT_IDLE, который вызывает некоторую функцию, которую нужно вызывать каждые 150 миллисекунд или около того. После вызова функции обработчик вызывает:

wx.CallLater(150,self._clear_idle_block_and_do)

Эта функция _clear_idle_block_and_do в основном публикует другое событие EVT_IDLE, продолжая цикл.

Теперь я заметил, что, когда другие виджеты в графическом интерфейсе выполняют тяжелую работу, обработчик событий EVT_IDLE почти не вызывается! Иногда он не вызывается в течение 4 секунд, что слишком много.

Это потому, что wx.CallLater работает плохо? Могу ли я что-нибудь сделать?


person Ram Rachum    schedule 14.08.2009    source источник


Ответы (2)


Ожидание занимает так много времени, потому что оно ждет простоя. Очевидно, что если у вас есть "другие виджеты, делающие тяжелую работу", простоев будет не скоро. Если вы хотите периодическое событие, используйте таймер.

person MSalters    schedule 14.08.2009

Вот модуль, который создает таймер, который не страдает этой проблемой.

#threadtimer.py

import threading
import time
import wx

wxEVT_THREAD_TIMER = wx.NewEventType()
EVT_THREAD_TIMER = wx.PyEventBinder(wxEVT_THREAD_TIMER, 1)

class ThreadTimer(object):
   def __init__(self, parent):
        self.parent = parent
        self.thread = Thread()
        self.thread.parent = self
        self.alive = False

   def start(self, interval):
       self.interval = interval
       self.alive = True
       self.thread.start()

   def stop(self):
       self.alive = False

class Thread(threading.Thread):
    def run(self):
       while self.parent.alive:
           time.sleep(self.parent.interval / 1000.0)
           event = wx.PyEvent()
           event.SetEventType(wxEVT_THREAD_TIMER)
           wx.PostEvent(self.parent.parent, event)

Для использования в программе:

import threadtimer

timer = threadtimer.ThreadTimer(window)
timer.start(150)
window.Bind(threadtimer.EVT_THREAD_TIMER, function_to_call)
person Ram Rachum    schedule 14.08.2009