長い間、モーダルダイアログがどのように実装されているのか疑問に思っていました。
例としてQtを取り上げます。(ほぼすべてのGUIツールキットにこのメカニズムがあります)
メインイベントループでは、スロットが呼び出され、このスロットでモーダルダイアログが開きます。ダイアログが閉じる前に、スロットは制御をメインイベントループに戻しません。そのため、メインイベントループがブロックされて応答しなくなると思いました。モーダルダイアログを開いても、UIを再描画したり、曲線やグラフを表示し続けたりするなど、背景のメインウィンドウはまだ機能しているため、これは明らかに当てはまりません。ユーザー入力を受け付けないようになります。
実験しました。スロットでモーダルダイアログを開きませんでしたが、そこで新しいスレッドを開始し、そのスロットでスレッドが終了するのを待ちます。これにより、メインイベントループが確実にブロックされました。
結局、モーダルダイアログはどのように実装されますか?メインイベントループのブロックを解除し、同時に呼び出しスロットをブロックするにはどうすればよいですか?