1

wx.ProgressDialog を使用して、プログラムの進行状況を表示したいと考えています。押すとこの機能が実行されるボタンがあります。

def runmiP(self, event):
    predictor.runPrediction(self.uploadProtInterestField.GetValue(), self.uploadAllProteinsField.GetValue(), self.uploadPfamTextField.GetValue(), \
                   self.edit_eval_all.Value, self.edit_eval_small.Value, self.saveOutputField)

predictor は私が書いた python パッケージです。予測子から進行状況を取得して進行状況バーに表示するにはどうすればよいですか? 返せる値は 1 つだけです。何度も (毎分など) 呼び出して、どこを離れたかを覚えておき、どれくらい離れているかを戻して、もう一度呼び出す必要がありますか? 何かのようなもの

while 1: 
    time.sleep(60)
    predictor.runPrediction(self.uploadProtInterestField.GetValue(), self.uploadAllProteinsField.GetValue(), self.uploadPfamTextField.GetValue(), \
                   self.edit_eval_all.Value, self.edit_eval_small.Value, self.saveOutputField)

または、これを行うより良い方法はありますか?

4

1 に答える 1

3

これは一般的な問題です。(これを別のスレッドで既に実行していない限り、プログレス バーの更新に失敗するだけでなく、UI 全体をブロックしていることになりますよね?) そして、それを解決するには 2 つの一般的な方法があります。

  • コールバックを runPrediction に渡し、progressCallback(sofar, total)ループを X 回ごと、Y% ごと、または Z 秒ごとに呼び出すようにします。(キューにポストして条件を起動する、パイプまたはソケットを介してメッセージを送信するなど、他の通信メカニズムを使用することもできますが、考え方は同じです。)

  • runPrediction を、順番に実行できる個別の小さなジョブに分割し、次のジョブを開始するたびに進行状況を更新します。

あなたの解決策は、基本的には少し不器用ですが、多くの場合完全に合理的な、2 番目のアイデアのバージョンです。ジョブを分割する明確な方法がなくても、ジョブを中断し、その場所に保管して後で再開する合理的な方法がある場合、それは事実上、ジョブを分割することと同じですよね?

Python は、多くの場合、2 番目のアイデアを実行するためのより単純でクリーンな方法を提供します。runPrediction をジェネレーターに変えて、最後にすべての結果を返すのではなく、入ってくると結果を生成します。次に、各値が戻ってくるたびに進行状況を更新します。

于 2012-11-30T22:13:05.510 に答える