ついに出来ました。
マルチスレッド技術を利用した画期的機能が。
って、そんな大したものではありません。
スレッド化技術は、この時代当たり前になりつつありますが、
なかなか難しそうで、手をつけてませんでした。
とある機能において、どうしても必要になって、挑戦してみたというわけです。
あらかじめ言っときますけど、しょぼいものです。
時間のかかる処理を行わせている間に、それを中断させることを可能にする。
たったそれだけのことなんですが、ここにはスレッドが必須なのでした。
今後のためにも、ここにその概要を残しておきたいと思います。
(開発環境: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ツールにもこれを導入しまーす。
こんにちは。スレッドについて調べていて、このブログを拝見させて頂きました。
私はVisualC++.NET standardVer.2003 Framework v1.1を使っています。Form1というダイアログの中に”受信”ボタンと”受信終了”ボタンが表示されています。受信ボタンをおすと、データを受信しています。データを受信している間は、”受信終了”ボタンが無効になります。(即ち、受信終了ボタンをクリックしても受け付けられません。)
>”受信”ボタンをクリックするとデータ受信を続け、”受信終了”ボタンをクリックするとデータ受信を終了する。以後も”受信”と”受信終了”を繰り返すことを実現したいと思います。
CAD日記さんのこの記事は、私の実現したいことに極めて近いと思います。
あなたの作成したソースプログラムを送っていただけませんでしょうか?よろしくお願い致します。
t03m075a@mail.cc.niigata-u.ac.jp
kazuさん、こんにちは。
コメントありがとうございます。
すみませんが、ソースを送ることはできません。
質問なんかがあれば、私の答えられる範疇でお答えします。
私の場合VC6のMFCが中心なので、.NET Framework固有の処理は全然知らないんですけどね。
お返事ありがとうございます。無理を言って申し訳ありませんでした。
CAD日記さんのソースを参考にできたらと思ったのですが、実は何をすべきかがまだはっきりと決まっていないのです。
またわからないことがあったらご質問させて頂きたいと思います!ありがとうございました。
まずは骨組みをつくってみて、細部で行き詰ったら質問してもらえれば、と思います。ネットの世界には、詳しい人がごろごろいますからね。がんばって下さい。
はい!ありがとうございます!
この前は、ご馳走様。
こっちもまったく記憶が無いくらい飲んだから、キツカッタ!
今度は、場所をかえて全員参加させるから。予定は、8月末の週末な!
久ぶりに見たら、まったくわからない文だよ。PC奥が深いね。
ほんと、かなり飲んだな。
翌日は廃人のようになっていたよ。
全員ね...そいつは厳しいと思う。
ま、このブログもたまには覗いてみてくれ。
じゃ、また!