0

コンボ ボックスのラグをなくすために、いくつかの 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'

スレッドが呼び出すコードが実行された後にのみ実行されます...そう..なぜこのように動作しているのかわかりません。

同時に実行されないのはなぜですか?

4

1 に答える 1

4

あなたのtarget一部ではthreading.Thread、関数を呼び出すべきではありません。代わりに、関数オブジェクトと引数を与えます。そのようなthreading.Thread(target=self.checker args=loadingThread).start()

于 2012-10-12T04:27:20.820 に答える