マルチスレッドSDIとは何なのか

SDIについて

WTLのアプリケーションウィザードでSDI, MDI, マルチスレッドSDI, 他色々を選択できます。
IT用語辞典 e-Wordsによれば、SDIはメモ帳で、MDIはExcelのようなウィンドウです。Excelは1つの親ウィンドウが、複数の子ウィンドウそれぞれに1枚ずつシートを表示させていますが、メモ帳は1つのウィンドウにつき1つのテキストファイルを表示するだけです。
SDIとMDIは、見た目にはそれだけの違いだと思います。その違いで操作方法も少し変わりますけど。

マルチスレッドSDI(日記調)

WTLのアプリケーションウィザードで、マルチスレッドSDIアプリケーションの、ビューの種類を通常ウィンドウにしてプロジェクトを作成した。その結果、C+プロジェクト名+Viewという名の付いたクラスが作られていた。どうやらそのウィンドウがビューウィンドウ(*1)らしい。
フレームウィンドウはいくつも作ることができるようだ。つまりビューは、1つのプロセスでいくつも作れる。フレームウィンドウを作る際には「スレッドマネージャ」と呼ばれるクラスのインスタンスを経由する。


「スレッドマネージャ」のインスタンスはWinMainで1つだけ作る。それのAddThreadメソッドは、呼び出されるごとに1つのスレッドを作る。そのスレッドは1つのフレームウィンドウを作り、そのウィンドウが消えるまで待つ。ウィンドウが消えると、待っていたスレッドも即座に終了する。「スレッドマネージャ」のRunメソッドはそれらのスレッドのどれか1つが終了するのを待っていて、スレッドが終了したらその事後処理を行う(スレッドハンドルを閉じる)。もしその時点でスレッドが1つも無くなったら(=ウィンドウが1つも無くなったら)、プロセスそのものが終了となる。

これは、IE6の事がそのまま当てはまる。

  1. ダブルクリックやスタートメニューから起動すると、IEXPLORER.exeというプログラムが起動する。
  2. 「驚愕」で検索して、目に付いたページを「右クリック→リンクを新しいウィンドウで開く」で片っ端から開く。
  3. 開きまくったウィンドウを片っ端から、見ては閉じ、見ては閉じを繰り返す。
  4. 検索結果のページも含め、全てのページを閉じると、IEXPLORER.exeというプログラムそのものが終了する。

この、「1つのプロセスで同じウィンドウをたくさん」と「最後のウィンドウが消えたらプログラムが終了する」が、ぴったり当てはまっている。
この方法で実装されてるとは限らないけど、この方法でも実装できる。(それと、同じ種類のウィンドウじゃなくても従属関係のない複数のトップレベルウィンドウなら同じ事が言えるはず。*2
だからマルチスレッドSDIとは「一つのプロセス、多数のトップレベルウィンドウ」って事ですね。語呂悪いけど。

*1:メインウィンドウ(=フレームウィンドウ)にすっぽり納まる子ウィンドウ

*2:ちなみにトップレベルウィンドウとは、親ウィンドウを持たないか、デスクトップウィンドウが親であるようなウィンドウのこと。ソースはMSDN - about windwsより