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

1 回答 1

4

你不应该调用函数,而是给它函数对象和参数targetthreading.Threadthreading.Thread(target=self.checker args=loadingThread).start()

于 2012-10-12T04:27:20.820 回答