TerminateThread は、別のスレッドを強制的に終了させます。クリーンアップする機会がなく、そのトラックでスレッドが停止するため、絶対に呼び出すことは避けてください。これには、割り当てられたすべての CRT メモリが含まれます。
ExitThread は、現在実行中のスレッドが適切かつクリーンに停止するためのものです。上記で呼び出したときに、メイン (UI) スレッドを強制的に終了させ、実行中のスレッドをそのまま残した可能性があります。したがって、タスク マネージャーで証明されるように、プログラムはまだ実行されていました。スレッドが実際には終了していないため、GetExitCodeThread も失敗していた可能性があります。
しかし、スレッドを停止する正しい方法は、スレッドが終了する必要があることをクリーンな方法で明確に通知することです。 次に、メイン スレッドの終了を許可する前に、スレッドが単独で終了できるようにします。次の例では、グローバル フラグを使用して、終了する必要があることをスレッドに示しています。ただし、これは、スレッドが常にグローバル bool 状態をポーリングする機会があることを前提としています。もう 1 つのクリーンな方法は、各スレッドがイベント ハンドルで WaitForSingleObject を呼び出すようにすることです。イベント ハンドルが通知されると、スレッドはグローバル変数をチェックし、必要に応じて終了します。
bool global_Need_ToExit; // use a bool or replace with an event handle the thread shoudl wait on
void CleanAll()
{
//signal all threads to exit
global_Need_ToExit = true;
DWORD dwExit[MAX_THREAD];
for(int i = 0; i < MAX_THREAD; i++)
{
// actually wait for the thread to exit
WaitForSingleObject(hThread[i], WAIT_INFINITE);
// get the thread's exit code (I'm not sure why you need it)
GetExitCodeThread(hThread[i], &dwExit[i]);
// cleanup the thread
CloseHandle(hThread[i]);
hThread[i] = NULL;
}
}
DWORD __stdcall YourThreadFunction(void* pData)
{
while (global_Need_To_Exit == false)
{
// do more work
}
return 0; // same as ExitThread(0);
}