0

コマンドを CreateProcess に渡すことでプロセスのグループを起動する機能があります。この関数を連続して 2 回呼び出していますが、何らかの理由で関数が終了し、最初のグループのプロセスが終了する前に 2 回目に呼び出されます。

プロセスの 1 つだけが終了するのを待っているようです。次のバッチは、プロセスの最初のグループからアプリケーションの 1 つを閉じると起動されます。

アプリケーションのグループを一緒に起動し、それらのプロセスがすべて終了したときに次のグループを起動するために使用しています。WaitForMultipleObjectsグループ内のすべてのプロセスが終了するまでコールが待機しないのはなぜですか?

void ProcessLauncher::launch_processes(PROCESS_LIST_TYPE& processes)
{
unsigned long const CP_MAX_COMMANDLINE = 32768;
VECTOR_TYPE<PROCESS_INFORMATION> procs;
VECTOR_TYPE<HANDLE> pHandles;

for (auto proc : processes)
{
STRING_TYPE command = proc.program_name + L" " + proc.params;
STARTUPINFO sinfo = { 0 };
sinfo.cb = sizeof(STARTUPINFO);
PROCESS_INFORMATION pi = { 0 };
try {
    CHAR_TYPE* commandline = new CHAR_TYPE[CP_MAX_COMMANDLINE];
    wcsncpy_s(commandline, CP_MAX_COMMANDLINE, command.c_str(), command.size() + 1);
    CreateProcess(nullptr,
        commandline,
        nullptr,
        nullptr,
        false,
        0,
        nullptr,
        nullptr,
        &sinfo,
        &pi);

    delete[]commandline;

    CloseHandle(pi.hThread);

    procs.push_back(pi);
    pHandles.push_back(pi.hProcess);
}
catch (std::bad_alloc&) {
    std::wcerr << L"Insufficient memory to launch application" << std::endl;
        return;
    }
}

if (WAIT_FAILED == WaitForMultipleObjects(pHandles.size(), pHandles.data(), TRUE, INFINITE))
    std::wcout << L"Failure waiting for process to terminate" << std::endl;
}
4

1 に答える 1

0

IInspectable が見つけたように、CreateProcess 呼び出しはプロセスの作成に失敗していましたが、まだベクターにハンドルを追加していました。CreateProcess が同等の値を TRUE に返した場合にのみ、ベクターにハンドルを追加するように変更しました。

于 2016-10-09T18:04:34.670 に答える