囲みコラム

自分自身との同期通信


ScriptEngineクラスでは、BMessengerクラスのSendMessage()メソッドを呼び出す際、返答メッセージ用のBMessageオブジェクトを引数に渡し、同期通信モードでメッセージを送っています。こうすると、SendMessage()を呼び出したスレッドは返答メッセージが返されるまで待たされます。これに対し、返答メッセージ用の第二引数を渡さないか、またはBHandlerオブジェクトを渡すと非同期モードでメッセージが送られ、メッセージを送出すると直ちにSendMessage()の呼び出しが終了します。

さて、ウィンドウのメッセージループを実行するウィンドウスレッドから、そのウィンドウ自身に対して同期モードでメッセージを送った場合、無限待ちが起きてしまいます。ウィンドウスレッドは返答メッセージが届くのを待つ一方、送られたメッセージを処理するのも同じウィンドウスレッドの役目であるため、メッセージが処理されないままウィンドウスレッドの動作が止まってしまうからです。

リスト8.10に載せた、ScriptorViewクラスのSendCommon()メソッドとGetWindowInfo()メソッドは、“Exec”ボタンがクリックされた時にウィンドウスレッドから呼び出されます。したがって、これらのメソッドではメッセージの送り先が自分の所属しているウィンドウであった場合、メッセージの送信を拒否するようにしているのです。


Art of BeOS Programming
koga@stprec.co.jp