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を実行します。