• ベストアンサー

スレッドの終了はどうやるんですか?

VCでスレッドの終了をしたいと考えてます。 自分自身のスレッドを終了するときは、AfxEndThread関数を使うようですが、動作中のスレッドを外から命令して終了させるときはどうすれば良いのか分からないです。教えていただけないでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • itohh
  • ベストアンサー率45% (210/459)
回答No.1

こんにちは。itohhといいます。 スレッドを終了させる方法は結構難しいですよ。 TerminateThread 関数を使用すれば、とりあえず強制終了させることは出来ます。 ただし、MSDNライブラリーにも記載されていますが、危険な方法です。 この関数で終了させられたスレッドは、終了処理が出来ません、ということは、 メモリリークを起こす可能性が大です。 一番まともな方法は、WM_CLOSEを対象スレッドにPostMessageすることです。 この場合は、メッセージループを内蔵するユーザーインターフェイススレッド にする必要があります。 またこの場合でも、デッドロックしているスレッドでは、終了できないと思います。 わたしが、良く行う方法は、 ワーカースレッドの場合:   ・シグナルを使用して、適時チェックする。(それなりに遅くなるのが難点)   ・自然に終わるのを待つ。 ユーザーインターフェイススレッドの場合:   ・WM_CLOSEを対象スレッドにPostMessageする。(デッドロックしないようなロジックにする)

COPY_ROBOT4
質問者

お礼

お忙しいところ、ありがとうございました。 スレッドを外から終了させる方法は、まだ検討中なのですが、今のところ、TerminateThread関数を使う予定です。 値の取得、書き込み、描画の処理があるのですがそれぞれに、セマフォを使ってロックし、ロックが終了したタイミングでTerminateThread関数を放とうと計画中です。まだ、VCを触り始めたばかりなので、できるか心配です。でもがんばります。ありがとうございました。

その他の回答 (1)

  • mkii
  • ベストアンサー率40% (43/105)
回答No.2

動作中のスレッドは常にある変数を監視し、 その変数がある決められた値になった場合に自ら終わるようにする。 外部からスレッドを終了させる場合は、その変数の値を変更するようにする。 かな。

COPY_ROBOT4
質問者

お礼

アドバイスありがとうございました。 違う案が聞けて勉強になりました。 お忙しい中、ありがとうございました。

関連するQ&A