■6851 / ) |
Re[3]: Control.Invokeが使えない件。 |
□投稿者/ 渋木宏明(ひどり) (309回)-(2007/08/25(Sat) 03:05:09)
|
> スレッド間通信の問題ですので、一回だけでは再現しない場合もあります。
精密に内容を把握していなかったかも>自分
「Control.Invoke() の使用による不都合の原因は Windows のメッセージング機構に問題がある」という話だと思ってたんですが、そうではなくて「不都合の原因は Control.Invoke() の実装にあるのでは?」というお話なんですね?
とすると、ヘンテコな現象が起きる原因は
> ちなみに、Control.InvokeはPostMessageを使っています。
な気がします。
同期メッセージング用に用意されている SendMessage() を使わないで、非同期メッセージングを使って外側で、自前で同期を取ろうとしているところに無理が出てるのかもしれません。
> どういうInvoke内容だったら安全なんでしょうか?
ウィンドウやコモンコントロールのラッパに関して言えば、基本的には Control.Invoke() から戻ってくるまでの間、Control.Invoke() 先が有効なウィンドウハンドルを保持していればよろしんじゃないでしょうか。
もちろん、SendMessage() ですらデッドロックを起こすような変なことをしていないのが前提です。
> 話の内容からすると、 > Nyaruruさんも渋木宏明(ひどり)さんも、 > Control.Invokeのデッドロックに遭遇したことがないようですね。
無いです。
先にも述べたとおり、元々 SDK レベルで SendMessage() を使っている場合でさえ、条件が悪ければデッドロックを起こすことは分かっていますが、きわどいタイミングでメッセージ伝達が起きないように VC++ を多用していた頃からオブジェクトの寿命管理を徹底しています。
|
|