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 を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

関連記事

最小化したウインドウの位置を保存して復元するとまずい話(C++編)

ウインドウを最小化した状態としてタスクバーから右クリックして閉じるってやると、次回ウインドウを起動したときに画面外に出てしまって、操作不能になるアプリがある。そんなときは、タスクバーの上にカーソルを置 …

no image

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

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

no image

KB2538242

また、VC2005再頒布可能パッケージの新しいものが出た。 昨日のWindowsUpdateでそれっぽいのが出てきたから、 もしやと思ったらビンゴだった。 Microsoft Visual C++ 2 …

no image

SE

妻に勧められて、この本を呼んでみました。 SEのフシギな生態―失敗談から学ぶ成功のための30ヶ条 作者: きたみ りゅうじ 出版社/メーカー: 幻冬舎 発売日: 2005/12 メディア: 文庫 一言 …

PDFアレコレをバージョンアップ

1年ぶりにPDFアレコレをバージョンアップ。変更点は以下の通り。 Ver2.00 2019/10/13 ・プレービューからのページ回転に対応。PDFiumのPDF編集能力は低いため、iTextShar …