を介してスレッドを生成するループがAfxBeginThread
あり、CWinThread
ポインターを配列に格納します。各反復で、スレッドがnullでないことを確認し、スレッドのハンドルを別の配列に格納します。
const unsigned int maxThreads = 2;
CWinThread* threads[maxThreads];
HANDLE* handles[maxThreads];
for(unsigned int threadId=0; threadId < maxThreads; ++threadId)
{
threads[threadId] = AfxBeginThread(endToEndProc, &threadId,
0,0,CREATE_SUSPENDED);
if(threads[threadId] == NULL)
{
// die carefully
}
threads[threadId]->m_bAutoDelete = FALSE;
handles[threadId] = &threads[threadId]->m_hThread;
::ResumeThread(handles[threadId]);
}
DWORD result = ::WaitForMultipleObjects(maxThreads, handles[0],
TRUE, 20000*maxThreads);
ただし、WaitForMultipleObjects
常に、を返し、無効なハンドルWAIT_FAILED
をGetLastError
生成します。6
スレッドが正常に作成されてハンドルが有効になることを保証するには、戻り値のテストが不十分であるか、WaitForMultipleObjects呼び出しの前にハンドルが無効になっています。これは、に設定するAfxBeginThread
ことで防止できると思いました。m_bAutoDelete
FALSE
複数のスレッドが作成されたときにそれらを待機するためのより良い方法はありAfxBeginThread
ますか?
の場合は問題ないことに注意してくださいmaxThreads=1
。