関数のMAXIMUM_WAIT_OBJECTS
制限のためWaitForMultipleObjects
、独自の「スレッドを待機する」関数を作成しようとしましたが、機能しませんでした。どうすればいいのか、ヒントを教えてください。
これは私の「スレッドを待つ」機能です:
void WaitForThreads(std::set<HANDLE>& handles)
{
for (int i = 0; i < SECONDSTOWAIT; i++)
{
// erase idiom
for (std::set<HANDLE>::iterator it = handles.begin();
it != handles.end();)
{
if (WaitForSingleObject(*it, 0) == WAIT_OBJECT_0)
handles.erase(it++);
else
++it;
}
if (!handles.size())
// all threads terminated
return;
Sleep(1000);
}
// handles.size() threads still running
handles.clear();
}
スレッドが実行されている限りWaitForSingleObject
戻りますWAIT_TIMEOUT
が、スレッドが終了すると、戻り値はWAIT_FAILED
代わりにWAIT_OBJECT_0
. GetLastError
を返すため、スレッド ハンドルは無効になっていると思いますERROR_INVALID_HANDLE
。
MSDN は、次の解決策を提案しています。
- MAXIMUM_WAIT_OBJECTS ハンドルを待機するスレッドを作成し、そのスレッドと他のハンドルを待機します。この手法を使用して、ハンドルを MAXIMUM_WAIT_OBJECTS のグループに分割します。
- RegisterWaitForSingleObject を呼び出して、各ハンドルを待機します。スレッド プールの待機スレッドは、MAXIMUM_WAIT_OBJECTS 個の登録済みオブジェクトを待機し、オブジェクトが通知されるかタイムアウト間隔が経過した後にワーカー スレッドを割り当てます。
しかし、私にはどちらも大変な努力のように思えます。
編集:
スレッドは MFC 関数で作成されますAfxBeginThread
。返さCWinThread
れたポインタは、関連付けられたハンドルを取得するためにのみ使用されます。
CWinThread* thread = AfxBeginThread(LANAbfrage, par);
if ((*thread).m_hThread)
{
threads.insert((*thread).m_hThread);
helper::setStatus("%u LAN Threads active", threads.size());
}
else
theVar->TraceN("Error: Can not create thread");