none
MessageBox.Showで入力待機中のスレッドはどうなっている? RRS feed

  • 質問

  • 外池と申します。おそらく、どの言語でも共通の仕様になっていると思われるので.Netで質問させてください。

     

    Form上に配置したコントロールから発生するイベントを処理するイベントハンドラは、どれも同じThreadで実行されるものと理解しています。このことから、原則、あるイベントハンドラの処理が終了するまでは、たとえ別のイベントが発生していてもそのイベントハンドラへ制御が移ることはない、と理解していますが、これは正しいですよね?(この時点で間違ってたら、ご指摘頂けると嬉しいです。)

    -----------------------------

    しかし、「原則」に沿わない例として、あるイベントハンドラの中で、MessageBox.Showして、ユーザーの入力を待っている間は、他のイベントハンドラは呼び出されます。例えば、Timerコントロールで定期的に発生させているイベントや、表示のための各種コントロールのPaintイベントなどです。この場合、特にMessageBox.Showで待っている間、スレッドはどのように流れているのでしょうか?

     

    私の推測では、MessageBoxを表示させたときにMessageBoxから「戻るイベント」のエントリーポイントを登録しておいてメッセージループに戻り、待つ間、他のメッセージ(イベント)を通常通り処理し、ユーザーがMessageBoxのボタンを操作したら「戻るイベント」が発生して、一見したところ元のイベントハンドラに制御が戻るように見えるように内部的に工夫がしてあるのかと思っています。

     

    それとも、MessageBoxの戻り待機中の特別なメッセージループがあるのか・・・。

    -----------------------------

    MessageBoxの戻り待機中に、スレッドがブロックされてしまうような事態が有り得るのかどうか、特定のコントロールの特定のイベントのハンドラーではMessageBoxの戻り待機中は正しく動かないものがあるとか、スレッドの観点から、MessageBoxの使用上の注意があれば知っておきたいと思って、質問させて頂きました。

     

     

    2007年7月30日 6:52

回答

  • とっちゃん様

     

    早速ご回答頂きありがとうございます。「再入」の可能性に言及して頂いただけでも、大変参考になりました。

    2007年7月30日 9:04

すべての返信

  •  外池 さんからの引用

    それとも、MessageBoxの戻り待機中の特別なメッセージループがあるのか・・・。

    こちらですね。

    MessageBox.Show や ShowDialog の中に、専用のメッセージループが用意されています。

     

    そのため、モーダルなウィンドウを出しても、再描画などがブロックされることなく動作します。

     

    当然ですが、それらのメソッドが呼び出されるきっかけとなったイベントは終了していない状態で動きますので、場合によっては再入ということも起こりえます。

    2007年7月30日 8:20
  • とっちゃん様

     

    早速ご回答頂きありがとうございます。「再入」の可能性に言及して頂いただけでも、大変参考になりました。

    2007年7月30日 9:04