2012-10-12 88 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()

相关问题