<Return[T]><Top>

TerminateThread

Declare Function Api_TerminateThread& Lib "kernel32" Alias "TerminateThread" (ByVal hThread&, ByVal dwExitCode&)

Declare Function TerminateThread Lib "kernel32" Alias "TerminateThread" (ByVal hThread As Long, ByVal dwExitCode As Long) As Long

1 つのスレッドを終了させる。

パラメータ
hThread
    終了させるべきスレッドのハンドルを指定する。
    Windows NT/2000:このハンドルに、THREAD_TERMINATE アクセス権を割り当てておかなければならない。
dwExitCode
    スレッドの終了コードを指定する。スレッドの終了コードを取得するには、GetExitCodeThread 関数を使う。

戻り値
    関数が成功すると、0 以外の値が返る。
    関数が失敗すると、0 が返る。拡張エラー情報を取得するには、 関数を使う。

解説
    この関数は、スレッドを終了させる。そして、指定したスレッドには、ユーザーモードのコードを実行する機会と、初期のスタックの割り当てを

    解除する機会がない。またこの関数は、終了処理が進行中であることを、そのスレッドにアタッチしている DLL へに通知しない。
    TerminateThread 関数は、スレッドを無条件に終了させる危険な関数であり、非常に特別な場合にのみ使うべきである。対象とするスレ

    ッドが何を実行しているのか正確に把握していて、指定したスレッドが終了の時点で実行している可能性のあるすべてのコードを制御できる

    場合にのみ呼び出すべきである。たとえば、次のような問題を起こす可能性がある。
    •指定したスレッドが独自のスレッドがクリティカルセクションを持っている場合、そのクリティカルセクションは解放されない。
    •終了の時点でスレッドが特定の kernel32 呼び出しを実行している場合、そのスレッドが所属しているプロセスの kernel32 の状態が整合

      性のない状態に陥る可能性がある。
    •指定したスレッドが共有 DLL のグローバル状態を操作している場合、その DLL の状態が破棄され、その DLL を使うほかのスレッドに

      影響を及ぼす可能性がある。
    スレッドは、自らが TerminateThread 関数の実行対象となることを防止できない。唯一利用できる手段は、そのスレッド自身のハンドルへ

    のアクセスを制御することである。しかし、CreateThread 関数が返すスレッドハンドル、または CreateProcess 関数が 構造体に格納するス

    レッドハンドルには、THREAD_TERMINATE アクセス権が割り当てられているので、これらのハンドルを取得できる任意の呼び出し側は、

    そのスレッドを終了させることができる。
    TerminateThread 関数を呼び出した時点で、指定したスレッドがプロセス内の最後のスレッドだった場合は、そのプロセスも終了する。
    スレッドが終了する時点で、スレッドオブジェクトはシグナル状態になり、そのスレッドが終了するのを待っていた他のスレッドの条件を満た

    す。そのスレッドの終了ステータスは、STILL_ACTIVE から、dwExitCode パラメータで指定した値へ変化する。
    スレッドを終了させても、必ずしもそれに対応するスレッドオブジェクトがシステムから削除されるわけではない。スレッドに 1 つまたは複数の

    ハンドルが割り当てられている場合、最後のハンドルを閉じると、スレッドオブジェクトが自動的に削除される。