まるで駄目だマルチスレッド

会社でちゃんと絵が出てた状態なのに家だとまるで絵がでねぇ・・・環境依存の問題もあるのか。
たかが読み込み処理のスレッド化と思っていたがフルタイムの3日掛けて未だまともな状態に持っていけていない。
ただ、やりたいことはバックグラウンドでmqoをロードする処理の経過をプログレスバーで表示するモーダルダイアログを出したいだけである。
思い出すだけでいろんな問題があった。

  • sqlite3のConnectionがインスタンスの作ったスレッドでしか操作できないこと。
    • リクエストのたびにConnection作るようにして解決
  • メインスレッドをwxWidgetのダイアログに対してサブスレッドからEndModal()を呼んでやると何故かデッドロックする事
    • サブスレッドからダイアログにカスタムメッセージを送ってメインスレッドのイベントハンドラから呼ぶことで解決。参考先
  • OpenGLがスレッド単位でGLコンテキストやらを作らないといけない事
    • Ogre::ManualObjectという奴で頂点単位でポリゴンメッシュが作れるクラスがあるが内部でGL頂点バッファの操作をしてるようでハマる。
    • すばらしいことにOgreにスレッド単位のコンテキスト登録があったので、頂点データ類は
      サブスレッドからも正常に登録できるようになったが、何故かテクスチャはまともにロードできない。
      (エラーにならないが作成テクスチャサイズが4億四方とかわけわからん数字になってる)
    • 同じスレッドを使った処理でもレンダリングフォームだけ出して表示したときは何故か正常にテクスチャが出る。意味わからん。
    • スレッド読み込み終わった後メインスレッドにGLコンテキストを戻したタイミングでテクスチャをロードするととりあえずちゃんとロードできる。意味わからん。
  • 会社ではとりあえず動作不安ながら絵が出てたのに、家の環境じゃ何故かポリゴンすら出なくなってるー!new!
    • エラーっぽいログも無し。死にたい。

なんというか問題が出たときの手間のかかり方が普通の作業の比じゃない。
Pythonの標準機能レベルのだけを使った処理*1のスレッド化で全然問題は出なかったが、
外部ライブラリ*2やデバイス依存機能*3をスレッド化するときの落とし穴が多すぎる。
wxWidgetが悪いのかOgreエンジンが悪いのかOpenGLの仕様が問題なのかOSのAPIが悪いのか俺の頭が悪いのか検証するのが手間すぎる。
たぶん最後が正解なんだろう。
スレッドなんか嫌いだ。

http://wxwindowsjp.sourceforge.jp/docs/html/wx/wx494.htm

もちろん幾つかの状況ではスレッドは本当に理に適っています
(古典的な例では,サーバアプリケーションはクライアントの数だけのスレッドを用いる)が,
それ以外ではとても愚かな選択です.
(例:長い計算の途中で,プログレスダイアログの表示の為にスレッドを用いる)

愚かですよねー!!!
けど代案で示されてるidle handler使ったからって読み込み処理が非同期に動くってわけじゃないよねぇ?
それともwxWidgetにはスレッドを使わないでスイッチを実現する機能でもあるのか?あるとは思えないんだがー。
ジーループ回すんじゃなくてフレーム単位に処理を細分化しろとかいうのは正直勘弁。

*1:今回の例ならmqoのファイルパース処理など

*2:wxWidgetやpython-ogre

*3:ogreのOpenGL rendering System