を介してスレッドを生成するループが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_bAutoDeleteFALSE
複数のスレッドが作成されたときにそれらを待機するためのより良い方法はありAfxBeginThreadますか?
の場合は問題ないことに注意してくださいmaxThreads=1。