2009-04-08 17 views
12

私は、wxPythonインターフェイスを使って、Pythonでシミュレーションを実行するためのプログラムを作っています。プログラムでは、シミュレーションを作成することができ、プログラムはレンダリング(=計算)します。レンダリングは非常に時間がかかることがあります。Python/wxPython:バックグラウンドで継続的に仕事をしています

ユーザがシミュレーションを開始し、初期状態を定義するとき、ユーザがプログラム内でさまざまなことを行っている間、プログラムはバックグラウンドでシミュレーションを連続して実行します。いっぱいになるYouTubeスタイルのバーのようなもの:レンダリングされたポイントまでしかシミュレーションを再生できません。

レンダリング機能はどのように実行する必要がありますか?

答えて

4

新しいプロセスを起動して、バックグラウンドでレンダリングし、定期的にそれが戻ってきたかどうかを確認します。

サブプロセスモジュールhereとマルチプロセスモジュールhereのマニュアルがあります。 Jay氏によると、Python 2.6を使用している場合は、マルチプロセスがおそらく良いでしょう。つまり、両者のパフォーマンスに違いはないと私は考えています。マルチプロセスは、特定のことを簡単にするサブプロセスのラッパーであるようです。

サブプロセス/マルチプロセスは標準的な方法ですが、Parallel Pythonもご覧ください。

+0

以前は複数のプロセスで作業したことがありません。どこから始めますか?また、私はそれを行うさまざまな方法があることを理解しました。どちらを選ぶべきですか? –

+0

N.B.、これはシミュレーションを行うためのプログラムなので、パフォーマンスは非常に重要です。 –

+0

もしPython 2.6を使用することができれば、私はマルチプロセッシングモジュールがこれを達成するための標準的な方法だと考えています。お使いのOSやハードウェアと同じくらいのパフォーマンスを提供する必要があります。 –

7

私はthreading.Threadをバックグラウンドで実行し、wx.CallAfterを使用して自分のウィンドウスレッドに更新をポストしてユーザーに表示します。あなたは非常にわずかに異なるアプローチを使用してもかまわない場合

thread = threading.Thread(target=self.do_work) 
thread.setDaemon(True) 
thread.start() 

... 

def do_work(self): 
    # processing code here 
    while processing: 
     # do stuff 
     wx.CallAfter(self.update_view, args, kwargs) 

def update_view(self, args): 
    # do stuff with args 
    # since wx.CallAfter was used, it's safe to do GUI stuff here 
0

、あなたはstacklessのpythonを見ていると、あなたのレンダリング処理のためのタスクレットを作成することができます。私は個人的に使うのがとても簡単です。

7

役に立つかもしれないwxPython wiki about long running tasksに関する情報がかなりあります。彼らは基本的にスレッドを使用し、wx.PostEventはスレッドとメインwxイベントループ間の通信を処理します。

関連する問題