0

複数のスレッドを持つ MFC コードがあり、それらすべてが異なるパラメーターを使用してサブルーチンを再帰的に呼び出します。サブルーチンの最初で、関数 CheckKillEvent() を呼び出します。

bool CTestShellDlg::CheckKillEvent()
{
    DWORD waitS;
    waitS = WaitForSingleObject(h_KillEvent, 0);
    switch (waitS)
    {
    case WAIT_OBJECT_0:
        return true;
        break;
    case WAIT_TIMEOUT:
        return false;
        break;
    default:
        IERROR
            break;
    }
}

CheckKillEvent が true を返した場合、return() はすぐに返されます。

fyi、h_killEvent は次のように初期化されます。

h_KillEvent = CreateEvent(NULL, true, false, NULL);

つまり、手動リセットがあります。

ただし、これらのスレッドは、次のように Kill イベントを設定した後、(文字通り) 永遠に終了するようです。

bool CTestShellDlg::KillThreads()
{
        //Signall the killing event
        SetEvent(h_KillEvent);
        if (WaitForMultipleObjects(,,true,)==...)
        {
            ResetEvent(h_KillEvent);
            return true; //Killing successful
        }
    else
        return false; //Killing failed
}

問題は、複数のスレッドから CheckKillEvent() を呼び出すことに問題があるかどうかです。WaitForSingleObject() はクリティカル セクション内で実行する必要がありますか? それとも、再帰コードが自分自身を呼び出さなくなった時点まで再帰するのが苦手なだけですか?

4

1 に答える 1