2012-10-12 2 views
0

콤보 상자의 지체를 없애기 위해 GUI 코드를 쓰려고합니다. 사용자가 선택하는 옵션은 배경에서 약간의 웹 스크래핑을 수행하며 프로그램이 선택하는 옵션에 따라 프로그램이 필요한 데이터를 탐색 할 때 종종 지연 될 수 있습니다.이 스레드 코드가 동시에 실행되지 않는 이유는 무엇입니까?

docs의 경우 스레드를 시작한 것 같습니다. threading.Thread에 적절한 인수가 필요합니다. 다음과 같이 그래서 코드에서이 나의 시도는 다음과 같습니다

def EvtComboBox(self, event): 
    self.statusBox.AppendText('Fetching ' + event.GetString() + ' data.\n') 
    loadingThread = threading.Thread(target=self.doStuff(event), name='i_am_a_thread') 
    loadingThread.start() 
    threading.Thread(target=self.checker(loadingThread)).start() 

def doStuff(self, event): 
    self.statusBox.AppendText(event.GetString() + ':\n')   
    self.assets = self.scraper.loadConferencePage(event.GetString()) 
    self.statusBox.AppendText(str(self.scraper.getNumOfNewHandouts(self.assets)) + ' new handout(s) in Asset Manager\n' + 
           '-------------------------\n\n') 

def checker(self, loadingThread): 
    while threading.Thread.isAlive(loadingThread): 
     print True 

내가 기대하고있어 행동은 그 loadingthread 시작이며, 웹에서 필요한 데이터를 가져 오는 시작한다. 그 일을하는 동안 나는 내가 만든 두 번째 스레드가 첫 번째 스레드를 모니터 할 것이라고 생각했으며 마지막 두 가정은 "동시에"실행 중이므로 EvtComboBox 메서드가 완료되고 GUI의 콤보 상자가 닫히게됩니다. .

그러나 그 중 아무 것도 발생하지 않습니다. EvtComboBox 메서드가 실행되고 코드가 완전히 순차적으로 실행됩니다. 나는 두 개의 스레드 아래에 인쇄 문을 부착하는 경우 (다만이 실행됩니다 때, 그것은 단지 이후에 실행됩니다 스레드가 호출 코드를 실행됩니다

def EvtComboBox(self, event): 
    self.statusBox.AppendText('Fetching ' + event.GetString() + ' data.\n') 
    loadingThread = threading.Thread(target=self.doStuff(event), name='i_am_a_thread') 
    loadingThread.start() 
    threading.Thread(target=self.checker(loadingThread)).start() 
    print 'EvtComboBox method finished' 

보기 ... 그래서 .. 내가 확실 해요하기 왜 이런 식으로 행동한다

이 왜 동시에 실행되지

답변

4

threading.Threadtarget 부분에서 대신 당신이 그것을 함수 객체 및 인수를주고, 함수를 호출 할 수 없습니다한다.? 같은 threading.Thread(target=self.checker args=loadingThread).start()

관련 문제