[Message Prev][Message Next][Thread Prev][Thread Next][Message Index][Thread Index]

[MD:2989] Meadow 1.99a1 - Access violation.



Kyotaro HORIGUCHI <horiguchi.kyotaro@xxxxxxxxxxxxxxxxxxxxx> writes:

> とりあえず(自分がやったことに関しては)何がおきているのかはわかり
> ました.
>
>  自分に投げたメッセージ(WM_MULE_IMM...CONVERSION_WINDOW)を
> mw32WndProc が拾う前に自分で拾って捨ててしまっていました;_;

^^;;;

>  そのせいで本当に待っているメッセージがこなくて固まっていました.
>
> # この辺りの処理ではWindowsのメッセージの仕組みを使うのをやめたほ
> # うが平和じゃないでしょうか. いらないメッセージを捨てるときにま
> # ずいものを捨ててる可能性も出てくるし...
>
>>  同じ(Windowsの)ウインドウに対して多重にこのPostMessageをやると固
>> まるようなんですが, どうやってそれを防ぐかは私にはもっとちゃんと
>
>  自分自身のアクティブウィンドウにメッセージを投げそうになったとき
> は直接関数を呼び出すようにしてみたらとりあえず動いています.

いや、この変更は、ほとんどchaotic的と言えませんか? それに、
このままだとmain threadから呼ばれたときにまずいことになります。

要は、message threadから呼び出されたときまずいということですよね。
まあ、MW32_MAIN_THREAD_P()を用いても良いんですが。

で、私もなんで、ここだけ、POST_INFORM_MESSAGEを用いずに、PostMessage()を
使っていたのか思い出し始めました。

そもそも、Windowsのメッセージ処理は、私の考えでは、大体2つのパターンに
分けられます。

(1) criticalな情報交換。到達性保証
(2) UI実装の委譲手段 到達性は、UI制御によっては不要

で、今回の場合は、IMEのwindowの位置を決定しているだけなので、(2)に
該当します。で、同期性も必要ないので、PostMessage()で十分。

という理由だったんだと思います。そうすると、邪魔なのは、余計なREPLY messageだけで、
これがqueueを詰まらせるのだとすると、

Index: mw32fns.c
===================================================================
RCS file: /usr/local/Meadow/cvsroot/Meadow/src/mw32fns.c,v
retrieving revision 1.26
diff -c -r1.26 mw32fns.c
*** mw32fns.c	2002/02/09 12:52:59	1.26
--- mw32fns.c	2002/02/26 07:13:08
***************
*** 3221,3235 ****
  #endif /* not W32_VER4 */
    case WM_MULE_IMM_SET_COMPOSITION_FONT:
      mw32_set_ime_font(hwnd, (LPLOGFONT) lParam);
-     POST_THREAD_INFORM_MESSAGE(main_thread_id,
- 			       WM_MULE_IMM_SET_COMPOSITION_FONT_REPLY,
- 			       (WPARAM) 0, (LPARAM) 0);
-     break;
    case WM_MULE_IMM_SET_CONVERSION_WINDOW:
      mw32_set_ime_conv_window(hwnd, (int)wParam, (int)lParam);
-     POST_THREAD_INFORM_MESSAGE(main_thread_id,
- 			       WM_MULE_IMM_SET_CONVERSION_WINDOW_REPLY,
- 			       (WPARAM) 0, (LPARAM) 0);
      break;
  #endif /* not MEADOW and IME_CONTROL */
  
--- 3221,3228 ----

この変更で十分じゃないですかね。いまのところ、WM_MULE_IMM_SET_COMPOSITION_FONTは
使用されていませんけど、これも同じことなので削っときましょう。

from himi