我正在尝试编写一些gui代码来摆脱组合框中的延迟。用户选择的选项在后台进行一些Web抓取,并且根据他们选择的选项,当程序寻找所需的数据时,滞后有时可能很大。
对于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
方法,然后代码似乎完全按顺序运行。如果我在两个线程下面粘贴一个print语句(只是为了看它何时被执行,
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'
只有在线程调用的代码运行后才会执行 ...所以..我不确定它为什么会以这种方式运行。
为什么不同时执行?
答案 0 :(得分:4)
在target
threading.Thread
部分你不应该调用函数,而是给它函数对象和参数;例如threading.Thread(target=self.checker args=loadingThread).start()