重たいファイルの読み込み処理や変換など、いちいち待つ意味ないです。
エディタならその間も作業できなきゃいけません。
今回はMFCにてマルチスレッドを使う方法についてまとめます。
ということで SimpleConver に実際に導入した例をもとに、実装の詳細を示します。
まずは別スレッドにて行いたい関数を作ります。
次の例にならい、クラスに静的な関数(スレッド関数)とスレッド処理本体の関数を追加しましょう。
スレッド処理本体ではクラスの静的でないメンバ変数とか関数が使えます。
スレッド関数内では静的でない(static のつかない)メンバ変数や関数が
使えないと思っている人がいるようですが、そんなことないです。
今回のようにすれば、クラスの関数はどれでも別スレッドで行うことができます。
ではスレッドを開始させます。
このように記述するだけ。
あとは注意事項として次のことを覚えておきましょう。
UpdateData(TRUE); や UpdateData(FALSE); とかはスレッド内で呼べません。
AfxGetMainWnd() で返ってくるのは CWinThread* m_pLoadXMLThread->m_pMainWnd に渡したウィンドウです。
設定しないと NULL が返ってきます。
ダイアログの Create() も呼べません。
しかし、スレッドの処理と同期してUIを更新したいと思うのが普通でしょう。
なので UpdateData(TRUE); をスレッドから同期して呼ぶにはどうすればよいでしょうか?
はい、そんなときは次のようにスレッド内からメッセージをメインウィンドウに送ります。
あとはメッセージを受け取った側で処理をすれば問題なしです。
受け取り側は UpdateData(TRUE); や UpdateData(FALSE); とか問題なく呼べます。
ここでスレッドを待つ WaitForSingleObject とか使った場合、お互い待ち合うことになるので気をつけて(デッドロック)
スレッドの終了時に何かやりたいのであれば
今回のようにスレッド終了時に「メッセージをメインウィンドウへ送る」で解決できるでしょう。
以上です。
2011/06/19 最終更新