コンボ ボックスのラグをなくすために、いくつかの 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
が Web から必要なデータを取得し始めることです。それを行っている間、私が作成した 2 番目のスレッドがその最初のスレッドを監視すると考えました。最終的な仮定は、これら 2 つのスレッドが「同時に」実行されているため、EvtComboBox メソッドが終了し、GUI のコンボボックスが閉じることでした。 .
しかし、それは起こりません。EvtComboBox
メソッドが起動すると、コードは完全に順番に実行されているように見えます。2 つのスレッドの下に 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'
スレッドが呼び出すコードが実行された後にのみ実行されます...そう..なぜこのように動作しているのかわかりません。
同時に実行されないのはなぜですか?