我正在尝试编写一些 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'
它仅在线程调用的代码运行后才执行……所以……我不确定为什么它会以这种方式运行。
为什么不同时执行?