サイズ変更とデットロック

ウィンドウのサイズ変更ができるようになった。
画面内に受信したメッセージを表示していたが、リッチエディットコントロールを貼り付けてそこにもメッセージを表示できるようにした。
強烈なデットロックを見つけた。


ウィンドウサイズの変更は前回の続き。
やっぱりデバイスをResetするには、そのデバイスから生成されたさまざまな要素を解放してからじゃないとResetのときにエラーになるようである。今はテクスチャとフォントを生成しているのでこいつらを解放してからResetすると解決。
もちろん、Reset後は、テクスチャとフォントの再生成。
どうにもこうにも、綺麗にウィンドウの中にスクロールバーを記述する方法が思いつかないので、こうなったらこの際だから、外にウィンドウを出しちゃえってことで、リッチエディットコントロールを使って、DirectXのウィンドウの外にメッセージを表示するようにした。
最初、リッチエディットコントロールに対して、テキストを挿入する方法がわからなくて困った。
Webでいろいろ調べてると、選択、置換でやるみたい。
文章の一番後ろを選択しておいて、その選択してある部分の文字列を置換することで文字を挿入するようである。色の変更などもできた。
いい感じ。
んで、リッチエディットコントロールでいろいろ遊んでたら、デットロック発覚。
状況は以下の通り。
サブスレッドがDirectPlayのメッセージを受信。
処理の開始とともに、CriticalSection突入。
その間に、ウィンドウメッセージをポンプ。
処理の開始とともに、CriticalSectionに突入しようとしてロック。
先ほどの受信メッセージの処理の中で、SendMessage。
既に、ウィンドウメッセージのポンプで、CriticalSectionのロックがなされているので、SendMessageは処理されなくて、止る。
ということでデットロック完成です。
サブスレッドの中からはWindowMessageを飛ばさないように心がけてたんだけど、やっぱり漏れがあったか。中途半端にコントロール用のクラスを使うもんだから話がややこしいんだろうな。全部、PostMessage、SendMessageで自前で書いちゃえばこんな問題は出ないのに。
どーせ、今後もこの手の問題は出てくるので、構造改革を検討中。
こうゆう根の深くなりそうな問題は、早めに構造改革で対処しておくべし。

コメントを残す