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日記 より:

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

comment

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

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

関連記事

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

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

コマンドラインからパラメータを指定すればテキスト抽出や画像変換ができるPDFアレコレを公開

exeがパラメータを受け取って、GUI操作でできていることをCUI操作でやってやろうじゃないかという企画。以下の記事を書いたのが1週間前。ここまで設計したなら実装しなきゃいかんということで、ヒマな週末 …

【C#プログラミング】pictureBoxとBitmapで画面ズームと画面移動機能を実装したい

PDFアレコレでPDFを描画するために利用しているのがpictureBox。とっても便利なクラスで、PDFiumのでRenderした結果であるImageを渡すだけで済んでいる。こんな感じで。。 pic …

PDFアレコレでPDF暗号化(セキュリティ設定)の第一歩を踏み出した

PDFアレコレをバージョンアップ。約2か月ぶり。 Ver3.01 2020/7/26 ・セキュリティ設定を変更できるようにした。読取パスワード、編集パスワード、編集許可の各種項目が設定可能。  暗号化 …

電子印鑑のつくり方

PDFアレコレで捺印ができるようにしたわけだけど、PDFアレコレで印鑑を作ることはできない。別途つくったpdfまたはpngをnatsuinフォルダに入れておけば、捺印時にそいつらが指定可能になる。 電 …