サイトアイコン CAD日記

マルチスレッド

ついに出来ました。

マルチスレッド技術を利用した画期的機能が。

って、そんな大したものではありません。

スレッド化技術は、この時代当たり前になりつつありますが、

なかなか難しそうで、手をつけてませんでした。

とある機能において、どうしても必要になって、挑戦してみたというわけです。

あらかじめ言っときますけど、しょぼいものです。

時間のかかる処理を行わせている間に、それを中断させることを可能にする。

たったそれだけのことなんですが、ここにはスレッドが必須なのでした。

今後のためにも、ここにその概要を残しておきたいと思います。

(開発環境: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ツールにもこれを導入しまーす。

モバイルバージョンを終了