2

wxPythonでオブザーバーデザインパターンを実装しようとしています。バックグラウンドで大量のデータを計算するモデリングアプリケーションがあります。モデルの出力をGUIに表示したい場合があります。これは、さまざまな色の正方形のグリッドにすぎません。また、GUIを表示せずに計算を行う必要がある場合もあります。

オブザーバーパターンの利点は、次のような1行のコードを追加または削除するだけで、GUIをプラグインすることもプラグインしないこともできることです。

self.observers.append(MyWxGui())

または類似。これを行うには、1つのスレッドで計算を実行し、別のスレッドでwxGUIを実行する必要があります。wxPythonでこれを実行しようとしましたが、常に致命的なI/Oエラーが発生します。

python: Fatal IO error 11 (Resource temporarily unavailable) on X server :0.0.

http://wiki.wxpython.org/LongRunningTasksなどのwxPythonでのマルチスレッドに関するチュートリアルを読みましたが、それらはすべてメインスレッドで実行されているMainloop()を持ち、セカンダリスレッドで長時間実行されているタスクよりも必要です。逆になります。これは、メインスレッドにMainloop()がある場合、プログラムは計算を続行するのではなく、GUIからのイベントを待ってハングするためです。

また、サブスレッドでClientDCやPaintDCなどのデバイスコンテキスト(DC)を操作できないこともわかりましたが、同じスレッド内でwxコード全体を実行しています。

Mainloop()とすべてのwx GUIは、メインアプリケーションのものではない独自のスレッドで実行できますか?

Ubuntu10.10maverickでwxPython2.8.11.0を実行します。

4

1 に答える 1

3

その wiki ページを読めば、スレッドセーフな方法で wx.CallAfter、wxCallLater、または wx.PostEvent を使用して wx スレッドに通信できることがわかるはずです。ここに簡単なチュートリアルがあります:

http://www.blog.pythonlibrary.org/2010/05/22/wxpython-and-threads/

個人的には、Pubsub + 上記のスレッドセーフ メソッドの 1 つを使用して、wx MainLoop と通信します。Pubsub の優れた点は、メッセージをリッスンして適切に反応できることです。上記の例は、実際にそれを行う 1 つの方法を示しています。うまくいけば、それはあなたを助けるでしょう. それ以外の場合は、wxPython メーリング リストに参加して質問することを強くお勧めします: http://groups.google.com/group/wxpython-users/topics?pli=1

于 2010-12-06T15:00:15.053 に答える