WaitForMultipleObjects 不等待
Posted
技术标签:
【中文标题】WaitForMultipleObjects 不等待【英文标题】:WaitForMultipleObjects is not Waiting 【发布时间】:2016-10-09 01:43:01 【问题描述】:我有一个函数应该通过将命令传递给 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;
【问题讨论】:
每次调用你的函数时列表中有多少个进程? @conio 目前每次通话只有两个。 @conio 我忘了提一些关于等待的细节。我在问题的引用中添加了它们。当我结束第一组中的一个进程时,第二批启动。 您没有检查CreateProcess
调用的进程句柄,并且由于您没有正确引用命令行的应用程序路径名,因此无法创建进程不仅仅是理论上的可能性。
【参考方案1】:
正如 IInspectable 引导我发现的那样,CreateProcess 调用未能创建进程,但我仍在将句柄添加到向量中。我将其更改为仅在 CreateProcess 返回与 TRUE 的等效值时将句柄添加到向量。
【讨论】:
以上是关于WaitForMultipleObjects 不等待的主要内容,如果未能解决你的问题,请参考以下文章
WaitHandle.WaitAny 匹配 WaitForMultipleObjects 功能
在 WaitForMultipleObjects 窗口中等待可变数量的事件
WaitForMultipleObjects 到底啥意思,啥作用