CAD日記

主にAutoCADのことについて書いているけど、近頃は投資系ネタに注力している。自動売買、仮想通貨、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日記 より:

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

CAD日記 へ返信する コメントをキャンセル

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

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

関連記事

no image

Tech Ed

Windowsアプリつくって十数年経つけど、Tech Edに初めて行った。 アホらしそうだから毎年敬遠してきたけど、 行ってみたらそれなりにおもしろかった。 携帯で撮った写真。     Tech Ed …

マルチスレッドプログラミング(C++編)

マルチスレッドプログラミング(VB.net編) マルチスレッドプログラミング(C#編) もあるので、ご覧あれ。 5秒以上の時間を要する処理をやらせていると応答なしになってかっこ悪い、なんてことをアラフ …

no image

レイヤ付きPDFを出力する弊害

Illustratorという高価なアプリを使ってPDFを出力すると、PDFにレイヤが付いてしまって非表示にしたはずのレイヤが表示されて困ったなという事象に2回遭遇したので以下に記録。共通しているのが、 …

no image

ファイル選択でアプリ即死

まずはキーワードを並べる。 ・ファイル選択ダイアログ ・デスクトップ ・ツールチップ ・マウスカーソル ・2回目 ・落ちる(スッといなくなる) ・Adobe Reader 7 ・pdfshell.dl …

no image

プロパティシート

ソフト開発の話です。 私はVC6でソフトを作ってます。 ダイアログボックスの作りこみは、おもしろいものです。 プログラマーにとっては、デザイン的センスを問われる分野ですかね。 プロパティシートとは、ペ …