CAD日記

AutoCAD,DXF,DWG,SXFなどCADのことから、仮想通貨や投資関係、PC関係、プログラミング、国内海外旅行情報など何でもござれ。@caddiary

ソフト開発

マルチスレッド

投稿日:

ついに出来ました。

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

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

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

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

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

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

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

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

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

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

-ソフト開発

執筆者:


  1. kazu より:

    こんにちは。スレッドについて調べていて、このブログを拝見させて頂きました。
    私はVisualC++.NET standardVer.2003 Framework v1.1を使っています。Form1というダイアログの中に”受信”ボタンと”受信終了”ボタンが表示されています。受信ボタンをおすと、データを受信しています。データを受信している間は、”受信終了”ボタンが無効になります。(即ち、受信終了ボタンをクリックしても受け付けられません。)
    >”受信”ボタンをクリックするとデータ受信を続け、”受信終了”ボタンをクリックするとデータ受信を終了する。以後も”受信”と”受信終了”を繰り返すことを実現したいと思います。
    CAD日記さんのこの記事は、私の実現したいことに極めて近いと思います。
    あなたの作成したソースプログラムを送っていただけませんでしょうか?よろしくお願い致します。
    t03m075a@mail.cc.niigata-u.ac.jp

  2. CAD日記 より:

    kazuさん、こんにちは。
    コメントありがとうございます。
    すみませんが、ソースを送ることはできません。
    質問なんかがあれば、私の答えられる範疇でお答えします。
    私の場合VC6のMFCが中心なので、.NET Framework固有の処理は全然知らないんですけどね。

  3. kazu より:

    お返事ありがとうございます。無理を言って申し訳ありませんでした。
    CAD日記さんのソースを参考にできたらと思ったのですが、実は何をすべきかがまだはっきりと決まっていないのです。
    またわからないことがあったらご質問させて頂きたいと思います!ありがとうございました。

  4. CAD日記 より:

    まずは骨組みをつくってみて、細部で行き詰ったら質問してもらえれば、と思います。ネットの世界には、詳しい人がごろごろいますからね。がんばって下さい。

  5. kazu より:

    はい!ありがとうございます!

  6. くりくり より:

     この前は、ご馳走様。
    こっちもまったく記憶が無いくらい飲んだから、キツカッタ!
    今度は、場所をかえて全員参加させるから。予定は、8月末の週末な!
    久ぶりに見たら、まったくわからない文だよ。PC奥が深いね。

  7. CAD日記 より:

    ほんと、かなり飲んだな。
    翌日は廃人のようになっていたよ。
    全員ね...そいつは厳しいと思う。
    ま、このブログもたまには覗いてみてくれ。
    じゃ、また!

comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

関連記事

no image

VC6デバッグ

ここ数年抱えていた問題が一つ解決したので、ここに記しておこう。 VC6でデバッグしていると、たまに戻ってこないことがあったのさ。 別の言い方をすると、固まる、凍る、フリーズ、ハングアップ。 マウスは動 …

no image

テキストファイルの最大行数

バカでかいテキストファイルを作る必要があって、結果約2GBにもなった。 CADから出力するんだけど、7.5時間もかかってしまった。 中身を見ようと思って、おなじみ秀丸くんで開こうとしたら開けなかった。 …

no image

円周率

3.1415926535…。私が記憶しているのはここまでです。スーパーコンピュータを使って数億桁まで計算、なんてニュースをよく聞きますね。コンピュータの性能向上とアルゴリズムの工夫に対する …

no image

尻有

知る人ぞ知るアングラ系サイト。 尻有とか、どーもとか。 定期的にチェックして、マイソフトがクラックされてないかどうか チェックしてるんよ。 復活してましたね、どーもが。 入り口が、なかなか見つからなか …

no image

zlibの研究結果

zip圧縮・解凍のフリーソフトであるzlibについていろいろと調べた結果。最新版の1.2.11を使ってzlibwapi.dllを作ることはできたが、それを実際に使ってみるとまともに動かなかった。圧縮は …