2011-12-16 2 views
0

나는 간단한 PyGTK 응용 프로그램을 가지고 있습니다. 나는 일부 데이터를 가져오고 GUI를 새로 여러주기 작업을 실행해야하기 때문에,이 같은 스레드를 확장 :주문형 트리거가있는 정기 파이썬 스레드

class MyThread(threading.Thread):   
    def __init__(self): 
     threading.Thread.__init__(self) 
     self.setDaemon(True) 
     self.event = threading.Event() 
     self.event.set() 

    def run(self): 
     while self.event.is_set(): 
      timer = threading.Timer(60, self._run) 
      timer.start() 
      timer.join() 

    def cancel(self): 
     self.event.clear() 

    def _run(self): 
     gtk.threads_enter() 
     # do what need to be done, fetch data, update GUI 
     gtk.threads_leave() 

내가, 응용 프로그램 부트 스트랩에 스레드를 시작 일부 목록에 저장하고 종료하기 전에이를 취소 할 수 있습니다. 이것은 완벽하게 작동합니다.

지금은 새로 실행 버튼을 추가하여 스레드 중 하나가 즉시 실행되도록하고 현재 실행 중이 아닌 경우 실행 대기 시간을 기다리지 않습니다.

bool var를 MyThread에 추가하여 스레드가 실행 중인지 여부를 표시하고 (실행 전 _run 설정, 완료시 재설정), 실행 중이 아닌 경우 MyThread._run() 내 응용 프로그램이 응답을 종료하고 실행을 완료하지 못하게하는 _run 작업이되었습니다.

왜 이러한 일이 발생하는지 잘 모르겠습니다. 이 문제를 해결하는 가장 좋은 방법은 무엇입니까? 백그라운드에서 새로 고침을 실행하여 GUI를 차단하지 않아도 괜찮습니다.

실행을 호출하고 초 단위로 1을 전달하면 타이머가 더 빨리 트리거 할 수 있습니까?

답변

2

Timer을 사용하는 대신 다른 Event 개체를 시간 제한과 함께 사용하십시오. 그런 다음 버튼 콜백 내에서 해당 이벤트를 설정할 수 있습니다. 다음 코드는 (I 짧은 그것을 유지하기 위해 취소 코드를 제거했습니다)이 보여 "실행"기본적으로

import threading 

class MyThread(threading.Thread): 

    def __init__(self): 
     threading.Thread.__init__(self) 
     self.sleep_event = threading.Event() 
     self.damon = True 

    def run(self): 
     while True: 
      self.sleep_event.clear() 
      self.sleep_event.wait(60) 
      threading.Thread(target=self._run).start() 

    def _run(self): 
     print "run" 

my_thread = MyThread() 
my_thread.start() 

while True: 
    raw_input("Hit ENTER to force execution\n") 
    my_thread.sleep_event.set() 

는 60 초마다 인쇄됩니다. ENTER를 누르면 즉시 인쇄되고 60 초 후에 다시 인쇄됩니다.

+0

고마워요! 그게 바로 제가 찾던 것입니다. – umpirsky