• ベストアンサー

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

itohhの回答

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

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

COPY_ROBOT4
質問者

お礼

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

関連するQ&A

  • VC++スレッドの正しい終了のさせかた

    VC++6.0にてAfxBeginThreadで m_bAutoDelete = TRUEにてスレッドをおこしております。 この終了時に制御関数のwhileループを脱する様にし、 正常にスレッドを終了させているつもりです。 この後、再度(アプリは継続して起動したまま) AfxBeginThreadにて全く同じ処理で再開すると、 なぜか、前のスレッドが未だ動作しているかのごとく 制御関数内のTRACEが2重に出力されます。 再度、停止し、またスレッド起動すると、 今度は3重になったかの様な動作をします。 スレッドが正しく終了されていないのでは?と思った現象として、 1回起動時にアプリを終了させると正常終了しますが、 2回起動以上は必ずスレッドのメモリーリークが出ます。 メモリーリーク個所はAfxBeginThreadでした。 制御関数内で必要ないとは思いましたが、終了時に AfxEndThreadを使用しましたが現象は同じでした。 そこで質問です。 1)この現象は、スレッドが正常に終了されていない事に起因しているのでしょうか? 2)スレッドを正しく終了させるにはどうすればいいのでしょうか? 当方、制御関数がループを抜け、さらにm_bAutoDelete = TRUEであれば オブジェクトも自動的に破棄されると思っていたのですが。。。 以上、よろしくお願いします。

  • C#でスレッドを終了させるには、どのようにすれば良いでしょうか。

    C#でスレッドを終了させるには、どのようにすれば良いでしょうか。 http://msdn.microsoft.com/ja-jp/library/7a2f3ay4(VS.80).aspx のように、スレッドのループ条件をfalseにする関数を作りました。 ボタンを押したときにこの関数を呼び出すようにしたら、スレッドは終了しました。 しかし、アプリケーションが終了したらスレッドも終了するようにしたいと思います。 この関数をどこで呼び出すのが一般的でしょうか? よろしくお願いします。

  • スレッドの終了コード

    VC6.0でダイアログアプリケーションを作成しています。 デバッグモードで終了させると、アウトプットウィンドウに  スレッド 0x1124 終了、終了コード 0 (0x0)。  スレッド 0x1408 終了、終了コード 0 (0x0)。  スレッド 0x1118 終了、終了コード -1 (0xFFFFFFFF)。  スレッド 0x108C 終了、終了コード 0 (0x0)。 という内容が出力されるのですが、 終了コードが-1というのは異常終了になりますか? その場合、スレッド0x118を特定することはできるでしょうか? よろしくお願いいたします。

  • スレッド終了について

    複数のスレッドをbeginthreadで起動し、どれか1つでもスレッドが終了したら他のスレッドを終了させるというプログラムを組みたいのですが、どこかにそのようなサンプルありませんでしょうか?

  • スレッドの安全な終了のさせ方

    スレッドの安全な終了のさせ方  メインスレッドにてCreateThread命令を使い、あるサブスレッドを作りました。 このサブスレッドは内部でmallocを使い動的に配列領域を確保して その配列領域をforループ等で「かなり時間の掛かる処理」として繰り返し アクセスしています。 ループが終了した時に「free」を実行してmalloc領域を開放しています。 アプリ終了時にメインスレッドからこのサブスレッドを終了させるのに メインウインドウにWM_DESTROYメッセージが送られた時、これまで単に そこで「CloseHandle(hSubThread);」とだけ書いていたのですが、 もしかしたらこれでは場合によっては(サブスレッドがループ処理中だったら) malloc領域が開放されずにリークしてしまうのではないかと思いました。  そこでイベントオブジェクトを使い、サブスレッドがループ処理中の 時には非シグナル状態にして、ループが終了しfreeで領域を開放した後 シグナル状態にするということにして、メインスレッドはそれを WaitForSingleObjectで待つという構造にしました。 ところが「メインスレッドに待ちを作るな」という言葉通り、これでは 上手く行きませんでした。サブスレッドはその時間の掛かる処理の 最中でSendMassage等でメインスレッドの処理を促すような命令を (例えばその処理の進捗状況を表示するなど)を幾つも行っていたので、 もしWaitFor~でメインを待たせると「サブスレッドの処理も進まなくなり 結果両方がロックして動かなくなってしまう」という悲しい状況に 嵌ってしまうのです。 SendMessageを徹底的に無くすということも考えたのですが、 (例えばPostMessageに書き換えるなどもやってみたのですが、これは 全く意図した動作をしてくれない場合もあり)、別の方法では どうしても代替できないケースもあって、全て消すというのは 現実的ではないのかもと。。  このようなサブスレッドを安全に終了させるにはどうしたら良いでしょうか? あるいは単にデストロイ時にCloseHandleとするだけでも良いのでしょうか?

  • スレッド処理内での終了結果を知りたい

    VC++6.0(SP5)を使って、コマンドプロンプトのような処理を作成しています。  1.CreateProcess()でMS-DOSプロンプトを起動  2.CreatePipe()で実行コマンドの読み取り/終了監視スレッド用ハンドル作成  3.CreateThread()で実行コマンドの読み取り/終了監視スレッド作成  4.WriteFile()、ReadFile()を使っています。 'Dir'コマンド等を実行した際、通常プロンプトに表示されるメッセージを 読み取れてエディットボックスに表示できるのですが、異常/正常に関わらず 終了した時を取得したいのですが・・・。  (詳細)  1.WriteFile()を使って'Dir'コマンド実行  2.実行コマンドの出力が完了←この時点でコマンドプロンプトを終了させたい   ※WriteFile()関数の実行終了ではなく、'Dir'コマンド実行終了を知りたい 何方かご教授お願いします。

  • VC++2005のスレッド使用方法について

    現在、VC++2005 SP2にてDLLを作成しています。 DLLには一つスレッドがあり、開始関数が実行されれば、スレッドが起動。終了関数を実行すればスレッドを停止させたいと思っております。 関数を分けていますので、以下の内容をグローバルで宣言したいと考えています。 Thread^ oThread = gcnew Thread( gcnew ThreadStart( &CUart::ThreadProc ) );                                     ~~~~~~~~~~~~~~~~~~~~~~~~                                         実行関数です。 oThread->Start();  //開始関数のスレッド開始  oThread->Abort();  //終了関数のスレッド停止 現在、宣言をグローバルのところに配置して、ビルドすると エラー 1 error C3145: 'oThread' : グローバルまたは静的変数は、マネージ型 'System::Threading::Thread ^' を含むことはできません とエラーが発生してしまいます。 いろいろ調べましたが、なかなか進んでいない状態です。 使用方法が間違っているのでしょうか?申し訳ありませんが、教えてください。 もし、別の方法があればご教授願います。 よろしくお願いします。

  • VC++ Workerスレッドを強制終了させる方法

    VC++6.0でwinアプリを作っています。 ダイアログベースで、ボタンを押すとワーカースレッドを実行し、ここでデータ処理をしています。 もし、スレッド中でデータ処理時間がかかってしまうと、これをスレッド外で強制的に終了させたいですが、出来るのでしょうか。 よろしくお願いします。

  • スレッドを再生成する方法

    VBからC言語DLLを呼ぶプログラムを作っています。 DLLでスレッドを生成しているのですが、 VBから1回目の呼び出しではうまく動作するのですが、2回目はスレッドが生成されません。 2回目は1回目のスレッドが終了してから呼び出しているのですがなにか処理が必要なのでしょうか? スレッドは_beginthreadexで生成してスレッド関数内のreturnで終了しています。 closehandleを追加してみましたが駄目でした。

  • Threadの終了

    http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/index.html を見ると,スレッドの止め方が書いてありますが, これは,スレッドblinker内でループが回っていて初めてうまく行く, と(間違ってるかもしれませんが)理解しています. では下記のように,Thread2でループが回っていない場合は (*)の位置でThread2を止めるにはどうすればいいのか, 教えてくださる方はいらっしゃいませんでしょうか. (**)のClassAではSWTでGUIを表示させていて, それをThread1から閉じるというのが目的です. GUIを閉じない限りその先には進まないので, ループを回しThread2のrun()内で待機させることが出来なくて. public class Thread1 { Thread1(){ Thread2 t2 = new Thread2(); t2.start(); try { Thread.sleep(5000); } catch (InterruptedException e) { } (*)ここでThread2を終了させたい. } public static void main(String args[]){ new Thread1(); } class Thread2 extends Thread { public void run() { new ClassA(); ・・・(**) } } }

    • ベストアンサー
    • Java