disablebreak 状態で…No.09582
杉浦 まさき さん 01/09/03 23:39
 
こんばんは。杉浦 まさき です。

disablebreak を行った状態で
田楽DLLでダイアログを表示した時に、
バックグラウンドの秀丸ウィンドウをクリックしたり
ダイアログが秀丸ウィンドウに重なっている状態で
ダイアログを動かしたり…とにかく秀丸側に
何らかの Window message が送られた時に(?)
フリーズしてしまいました。
#ダイアログが出た状態で秀丸ウィンドウに触らないように(^^;
 操作を行うとフリーズしません。

ちなみに、田楽DLLのダイアログ表示部分は
大体以下のような処理を行っています。

1. スレッドを作成2. スレッド内で CreateDialogIndirectParam() を呼んで
 モードレスダイアログを作成し、
 続いてスレッド内でメッセージループを回す。
3. ダイアログを閉じる時は親プロセス側から
 スレッドに WM_CLOSE を送信。
4. ダイアログウィンドウが終了したらメッセージループを抜け、
 そのままスレッドも終了

#実際の(見るに耐えない(^^;)ソースも以下の場所から入手できます。
 http://www.ceres.dti.ne.jp/~sugiura/hidemaru/macros/dgserver/dengaku_src_1
95.lzh

もしかするとOS側の問題かもしれませんが、
もし可能なら対処して頂けると嬉しいです。

[ ]
RE:09582 disablebreak 状態で…No.09592
ひろ さん 01/09/04 11:42
 
 杉浦さん今日は、ひろです。
> disablebreak を行った状態で
> 田楽DLLでダイアログを表示した時に、
> バックグラウンドの秀丸ウィンドウをクリックしたり
> ダイアログが秀丸ウィンドウに重なっている状態で
> ダイアログを動かしたり…とにかく秀丸側に
> 何らかの Window message が送られた時に(?)
> フリーズしてしまいました。
 こちらにフォローしてしまいますが(^^;、確認出来て良かったです。
 私のマクロはウィンドを切り替えているので、disablebreak と田楽 DLL
によるダイアログ表示は怖くて使えない(;_;)。

[ ]
RE:09582 disablebreak 状態で…No.09625
秀丸担当 さん 01/09/05 18:37
 
>disablebreak を行った状態で
>田楽DLLでダイアログを表示した時

disablebreakしたときは、秀丸のメッセージループは停止しています。
田楽DLLのWAITCTRLNOTIFY関数が呼ばれたとき、スレッドのメッセージ
ループも停止しているような感じです。

そもそも秀丸のメッセージループが停止するのが諸悪の根源のような・・・

[ ]
RE:09625 disablebreak 状態で…No.09633
杉浦 まさき さん 01/09/05 23:39
 
ども、杉浦 です。

>disablebreakしたときは、秀丸のメッセージループは停止しています。
>田楽DLLのWAITCTRLNOTIFY関数が呼ばれたとき、スレッドのメッセージ
>ループも停止しているような感じです。

こちらでも WaitForSingleObject() を
MsgWaitForMultipleObjects() とかに変えたりして
試してみましたが、フリーズを避けることはできませんでした。
一体何と何がデッドロックしてるのやら…??
#Msg... に変えると disablebreak してなくても
 ダイアログの終了時にフリーズしてしまいました…なぜ(^^;?

>そもそも秀丸のメッセージループが停止するのが諸悪の根源のような・・・

GetMessage() したメッセージを単に破棄するとかしたら
どうなるでしょうか?


[ ]
RE:09633 disablebreak 状態で…No.09645
秀丸担当 さん 01/09/06 18:18
 
>GetMessage() したメッセージを単に破棄するとかしたら
>どうなるでしょうか?

田楽のスレッドは生き続けましたが、ダイアログを閉じることが
できませんでした。なぜ?

田楽のメッセージループが止まるのは、DiapatchMessageされたときの
処理内で秀丸にメッセージを送り、それが完了されないと止まってしまう
のだと思います。
フリーズするパターンの1つで、田楽のダイアログのタイトルバー
をクリックするとフリーズするというのがあり、WM_NCLBUTTONDBLCLK
を処理するときに、秀丸側のWM_WINDOWPOSCHANGINGが処理されないと
次に行けないようです。

[ ]
RE:09645 disablebreak 状態で…No.09652
杉浦 まさき さん 01/09/06 21:16
 
秀丸担当さん、こんばんは。
杉浦 まさき です。

>>GetMessage() したメッセージを単に破棄するとかしたら
>>どうなるでしょうか?
>田楽のスレッドは生き続けましたが、ダイアログを閉じることが
>できませんでした。なぜ?

うぅ、何故だろう…??
#その場合、ENDDIALOG() の呼出しまではいってるんでしょうか?

ところで、disablebreak 時にメッセージループ自体を止めるのは
なぜ何でしょうか?
#確かにマクロの処理を止めないための
 一番確実な方法ではありますが…(^^;。

>田楽のメッセージループが止まるのは、DiapatchMessageされたときの
>処理内で秀丸にメッセージを送り、それが完了されないと止まってしまう
>のだと思います。

テストどうもですm(_ _)m。
とりあえず上の方法でダイアログが閉じれるようにする、
という方向でも頑張ってみます(^^;。
#が、できれば秀丸側でも対応して頂けると嬉しいですm(_ _)m。

[ ]
RE:09652 disablebreak 状態で…No.09661
杉浦 まさき さん 01/09/06 23:56
 
ども、杉浦 まさき です。

>>田楽のスレッドは生き続けましたが、ダイアログを閉じることが
>>できませんでした。なぜ?
>うぅ、何故だろう…??
>#その場合、ENDDIALOG() の呼出しまではいってるんでしょうか?

ENDDIALOG() の中でダイアログウィンドウに
SendMessage() でメッセージを送っていた所を
PostMessage() に変えたらとりあえずダイアログは
閉じるようになりました。

で、田楽DLLの WAITCTRLNOTIFY() の中で
WaitForSingleObject() の代わりに
MsgWaitForMultipleObjects() を使って、
さらに自前でメッセージループを回すようにしたら、
disablebreak しても死ななくなりました。
#秀丸ウィンドウをクリックしても「実行を中止しますか?」
  のメッセージも出ません。

とりあえず解決できたみたいですが、DLLの関数内部で
勝手にメッセージループを回すことに
多少罪悪感(^^;を感じてます。
もしこれで秀丸側が問題なければ万事OKなんですが…??
#サーバの方に影響があるかもしれませんけど(^^;。

#一応修正したソースを以下の場所にアップしておきます。
http://www.ceres.dti.ne.jp/~sugiura/hidemaru/macros/dgserver/dengaku_src_196
b.lzh
#変更したのは sharedbuf.h と thread.h,cpp です。


[ ]
RE:09661 disablebreak 状態で…No.09672
秀丸担当 さん 01/09/07 18:11
 
>>#その場合、ENDDIALOG() の呼出しまではいってるんでしょうか?

ENDDIALOG()まではいってませんでした。

>とりあえず解決できたみたいですが、DLLの関数内部で
>勝手にメッセージループを回すことに
>多少罪悪感(^^;を感じてます。

これは処理したくないメッセージが処理されてしまい、
ちょっとまずいです。
申し訳無いですが、呼び出されるDLL関数内部でメッセージループ
を作るのはやめてください。

>ところで、disablebreak 時にメッセージループ自体を止めるのは
>なぜ何でしょうか?

たぶんマクロの処理を止めないための一番確実な方法ということ
だと・・・
諸悪の根源はここにあるので、次バージョンではdisablebreak
されていてもメッセージループは止めないようにします。
仕様通りマクロの中断はできないようにします。



[ ]
RE:09672 disablebreak 状態で…No.09677
杉浦 まさき さん 01/09/07 22:43
 
こんばんは。
杉浦 まさき です。

>>>#その場合、ENDDIALOG() の呼出しまではいってるんでしょうか?
>ENDDIALOG()まではいってませんでした。

う〜ん、まぁメッセージをブロックしている状態と
似た感じなんですね…でもスレッドのメッセージループは
動いてるのが謎かなぁ。

>>とりあえず解決できたみたいですが、DLLの関数内部で
>>勝手にメッセージループを回すことに
>>多少罪悪感(^^;を感じてます。
>これは処理したくないメッセージが処理されてしまい、
>ちょっとまずいです。
>申し訳無いですが、呼び出されるDLL関数内部でメッセージループ
>を作るのはやめてください。

了解です。というわけで、

>諸悪の根源はここにあるので、次バージョンではdisablebreak
>されていてもメッセージループは止めないようにします。
>仕様通りマクロの中断はできないようにします。

に期待します。
ではでは。

[ ]