1

関数の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");
4

2 に答える 2

3

しかし、私にはどちらも大変な努力のように思えます。

待機ハンドルで動作させたい場合は、それを行う必要があります。しかし、すべてのスレッドが終了するまでブロックするものだけが必要な場合は、SemaphoreまたはSynchronization Barrierを使用できます。

于 2013-09-23T21:55:39.087 に答える