0

を介してスレッドを生成するループが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_FAILEDGetLastError生成します。6スレッドが正常に作成されてハンドルが有効になることを保証するには、戻り値のテストが不十分であるか、WaitForMultipleObjects呼び出しの前にハンドルが無効になっています。これは、に設定するAfxBeginThreadことで防止できると思いました。m_bAutoDeleteFALSE

複数のスレッドが作成されたときにそれらを待機するためのより良い方法はありAfxBeginThreadますか?

の場合は問題ないことに注意してくださいmaxThreads=1

4

1 に答える 1

5

handles[0]1 つの有効なハンドルとそれに続く可能性のあるいくつかのデータを持つものを指します。maxThreads代わりに、配列に 2 つのハンドルを次々に配置する必要があることを示唆しています。したがって、エラー。

これは代わりにあなたが望むものです:

HANDLE handles[maxThreads];
//...
handles[threadId] = threads[threadId]->m_hThread;
//...
WaitForMultipleObjects(maxThreads, handles, ...
于 2012-08-23T11:54:46.120 に答える