2015年6月29日月曜日

System.Drawing.Graphicsのマルチスレッド非対応問題

Graphics.DrawImageはマルチスレッド対応していない。

http://tiltcorrector.seesaa.net/article/249984715.html



この時点でも驚愕の情報なんですが、DrawImageとDrawStringが並列処理でかちあうと例外が飛んでくるようなのです。Paintイベント時のGraphicsと、ビットマップから取り出したGraphicsでどこにかち合う要素があるのか全くわからないのですが。本当に、本当におかしなライブラリですWindows.Formsは。昔使ってた時は簡単にいろんなことが出来るなあと思いましたが、複雑なことは出来ないようです。複雑なことに使ったことがなかったので気付かなかったのですが、本当に全く困りました。これでは満足なパフォーマンスが出せそうにありません。

まあWinForm版はパイロット版という位置づけに自分の中でいつの間にか変わっていたので、パフォーマンスがそこまででなくてもいいような気もしますけれど。

しかも「InvalidOperationException オブジェクトは現在他の場所で使用されています」という例外で、MSDNにも記述がない上、私はいつも例外スロー時点でデバッグ中断する設定なのですが、InvalidOperationExceptionではあまりにも一般的すぎて例外スロー中断の例外に設定するわけにもいきません(結局設定しました。自分で投げてたInvalidOperationExceptionは全部他の例外に変えました。もっといい方法がないものでしょうか)

2015年6月24日水曜日

進捗

 前回25日までに仕上げたいといって、そしてもう25日にならんとしてるところですが、まだあと少しかかります。

 あと6個ぐらい機能を追加できれば、実用的に使えるとまではいかないまでも、プラグインで拡張したブラウザで見るのと比べてどう便利にできるのかを感じ取ってもらえるレベルまで進められると思います。そこまでいければソフトウェアサブレあたりでひっそりと公開して、フィードバックをもらったり、寄付を募ったりも出来るようになるはずです。

 インターネット代金未払の督促状がだいたい毎月5日あたりにくるので、その辺をデッドラインとして、それより前に仕上げないといけないので、あと1週間と考えて、1日1個機能を実装できればうまくいきます。1週間なら限界を振りきって1日10時間ぐらいやっても、燃え尽きずにやれるはずです。しかし急ぎすぎてコードの品質を下げてしまうのはもうコリゴリなので、品質を下げないでやりたいところですが、普通にやると2日で機能1個ぐらいのペースになってちょっと間に合いません。

 やや急ぎながら、コードの品質は下げずに、一週間ちょっとで燃え尽きるぐらいのペースでやっていこうと思います。

2015年6月13日土曜日

今後の予定

 ようやく全体的な再設計が出来ました。私はコードを書きながら設計するので、実装も大体終わった感があります。

 あとはデバッグして機能を追加して出すだけですが、口で言うのは本当に簡単です。しかし設計のために悩み苦しむフェーズが終わったので、ここから一気にスピードアップして、うまくいく可能性も、かなりあるような、楽観的観測をしています。

 来月までにお金が入らないと死んでしまうので、ベータ版を出して寄付を募って、実際に寄付が集まるまでの時間を考えると(本当に集まればいいんですが)、25日ぐらいには出さないといけないでしょう。そこから逆算して取捨選択して、どの機能を実装していくか決めていく必要があります。

 ベータ版を出した後の予定ですが、デバッグしながら英語版を準備し、さらに間に合わなかった機能を追加していき、デバッグと機能追加が終わったら、Mono&GTK#環境に移植して、マックやLinuxでも動くようにしようと思っています。今やっているWindows Form環境だとどうしても描画がカクつくのが直せないらしいのです。

http://dobon.net/vb/dotnet/control/doublebuffered.html
>フォームに大量のコントロールを配置している時のちらつきには別の理由があり、上記の方法では解決できません。

>このようにすると、一部のコントロールが正常に表示されなくなったり、最小化ボタンなどのアニメーションが無効になったり、Aeroを有効にしていると機能しなかったりなど、様々な問題があるようです。よって、できれば使用しない方が良いでしょう。


 変な設定を入れるとかなり描画がスムーズになるのですが、その設定がバグだらけでいろいろとおかしくなるということです。しかしこれ以外に頼れるものがないので今回はこれでいきます。

 バグだらけの設定に頼るのは一時的にして、最終的には全てのベースになる、ちゃんとしたPC版を作らなければならないように思います。いずれはスマホにも移植しようと思っていますが、ベースがしっかりしていなければ難しいでしょう。

 スマホ版はXamarin.Formsを使ってAndroid/iPhone両対応にする予定ですが、いきなりクロスプラットフォームにするのは難しいので、これに合わせて一旦Windows/Mac/Linuxのクロスプラットフォーム版を作ることにしました。オブジェクト指向のテクニックを使ってWindows FormとGTK#、.NetとMonoに両対応させます。UIをブラックボックス化して入れ替えられるように設計しなおしたので、おそらくうまくいくでしょう。

 実際はGTK#を使ったことがないので、カクつかずうまく描画できるか、そもそもまともに動かせるのか、といったことはやってみないとわからないのですが、まあ何をするにもわからないことだらけです。楽観的にいこうと思います。