ついに出来ました。
マルチスレッド技術を利用した画期的機能が。
って、そんな大したものではありません。
スレッド化技術は、この時代当たり前になりつつありますが、
なかなか難しそうで、手をつけてませんでした。
とある機能において、どうしても必要になって、挑戦してみたというわけです。
あらかじめ言っときますけど、しょぼいものです。
時間のかかる処理を行わせている間に、それを中断させることを可能にする。
たったそれだけのことなんですが、ここにはスレッドが必須なのでした。
今後のためにも、ここにその概要を残しておきたいと思います。
(開発環境:VC++6.0)
最も重要なキーワードは、AfxBeginThread です。
この関数を呼ぶと、新しいスレッドが出来て、既存の処理と平行して、
スレッドが動くようになるのです。
ここまでは簡単な話で、その理屈はわかっていたし、実績もありました。
問題は同期です。
新スレッドが終わった後に、既存スレッドとどうやって同期をとるかです。
新スレッドは時間のかかる処理を担い、既存スレッドはユーザーインターフェースを
請け負います。
既存スレッド側で中断ボタンを押されたというのを、新スレッド側に渡すのはまだ簡単です。
既存スレッド側に持たせた変数のアドレスを、新スレッド側に持たせておいて、
既存スレッド側で変数の値を変えれば、新スレッド側にも通知できます。
これで、中断時に新スレッド側の処理は安全に終了することができます。
残る問題は一つ。
新スレッドの処理が完了もしくは中断したときに、既存スレッドにどうやって知らせるかです。
二つに分岐した処理の流れを一つに収束させる、と言い変えてもよいでしょう。
次のキーワードは、WaitForSingleObject です。
これを使うためには、AfxBeginThread 呼び出し時に工夫しなければなりません。
CWinThread* m_pThread = AfxBeginThread( Func, ,...
m_pThread->m_bAutoDelete = FALSE; // 自動破棄フラグクリア
AfxBeginThread の返り値が、CWindThread のポインターなんですが、
これをとっておいて、かつ自動破棄フラグをクリアしておきます。
スレッドが終わったら、勝手にいなくなってしまったら、
その終わるタイミングがわからないですから。
で、新スレッド側で処理終了時に、既存スレッド側にPostMessageしてやって、
既存スレッド側では、以下のようにして、新スレッドが終了するのを待ちます。
WaitForSingleObject( m_pThread->m_hThread, INFINITE );
これをやらないと、MFC側で妙なエラーが出ます。
これでスレッド間の同期がとれました。
最後に、m_pThread を delete するのを忘れてはいけません。
ひとつ、かしこくなりました。
PMツールにもこれを導入しまーす。