WaitForMultipleObjects is not Waiting

WaitForMultipleObjects is not Waiting

本文关键字:Waiting not is WaitForMultipleObjects      更新时间:2023-10-16

我有一个函数,它应该通过向CreateProcess传递命令来启动一组进程。我连续调用这个函数两次,但不知何故,该函数退出,并在第一组进程完成之前被第二次调用。

它似乎只等待一个进程退出。下一批会在我关闭第一组中的某个应用程序时启动流程。

我使用它一起启动一组应用程序,并在所有这些进程退出时启动下一个组。为什么我的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;
}

作为IInspectable引导我发现,CreateProcess调用未能创建进程,但我仍然在向向量添加句柄。我将其更改为仅在CreateProcess返回相当于TRUE的值时才向矢量添加句柄。