2009-08-14 2 views
1

내 wxPython 응용 프로그램에서 나는 150 밀리 초마다 한 번 호출해야하는 함수를 호출하는 EVT_IDLE 처리기를 가지고 있습니다. 함수를 호출 한 후, 핸들러는 호출 기능은 기본적으로주기를 계속, 다른 EVT_IDLE 이벤트를 보냅니다wxPython : wx.CallLater가 매우 늦음

wx.CallLater(150,self._clear_idle_block_and_do) 

_clear_idle_block_and_do있다.

이제 GUI의 다른 위젯이 열심히 노력하고있을 때 EVT_IDLE 이벤트 핸들러가 거의 호출되지 않습니다. 언젠가 그것은 4 초 동안 불리지 않는다. 그것은 너무 많이 길다.

wx.CallLater의 성능이 좋지 않아서입니까? 내가 할 수있는 일이 있니?

답변

2

다음은이 문제가 발생하지 않는 타이머를 만드는 모듈입니다.

import threadtimer 

timer = threadtimer.ThreadTimer(window) 
timer.start(150) 
window.Bind(threadtimer.EVT_THREAD_TIMER, function_to_call) 
:

#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) 

하는 프로그램에서 사용하려면

5

유휴 시간을 기다리기 때문에 대기 시간이 오래 걸립니다. 당신이 "다른 일을하는 위젯"을 가지고 있다면 분명히 유휴 시간이 없을 것입니다. 주기적인 이벤트가 필요하면 타이머를 사용하십시오.