WaitForMultipleObjects failing c++



我目前正在编写一个程序,该程序将同时在组中运行多个程序,并单独运行其他程序。

if( WAIT_FAILED == WaitForMultipleObjects(numberOfProgramsRan, &information[i].hProcess, TRUE, INFINITE) ) { wcerr << L"Failure waiting for process" << endl; }

numberOfProgramsRan是我在循环中运行的程序数。&information[i]是保存来自创建进程的进程信息的vector

当我在for循环中创建进程时,如果创建了两个或更少的进程(因此传入了两个程序来运行),我的程序将等待,然后再运行下一个进程。如果创建两个以上的进程(或在向量中传入两个以上程序),则WaitForMultipleObjects将失败。

如果我需要进一步解释我的问题,请告诉我。

感谢您的帮助

如果只等待单个进程(索引i),则应使用WaitForSingleObject。如果您正在等待多个进程,则需要像其他人所说的那样传递一个句柄数组,而不是一个指向PROCESS_INFORMATION的指针。如果您坚持使用WaitFoRmultipleObject作为单个对象,请使用:

WaitForMultipleObjects(1, &information[i].hProcess, TRUE, INFINITE)

如果使用1以外的任何值,请查看PROCESS_INFORMATION的定义:

typedef struct _PROCESS_INFORMATION {
  HANDLE hProcess;
  HANDLE hThread;
  DWORD  dwProcessId;
  DWORD  dwThreadId;
} PROCESS_INFORMATION, *LPPROCESS_INFORMATION;

以下dwProcessId和dwThreadID将被错误地视为句柄,您的调用将无法按预期工作。

类似于:

HANDLE hProcess[MAX_PROCESSES];
for(int i=0; i<numberOfProgramsRan; i++)
{
  hProcess[i] = information[i].hProcess;
}
WaitForMultipleObjects(numberOfProgramsRan, hProcess, TRUE, INFINITE);

将等待您的所有流程。

&information[i].hProcess应该是指向包含numberOfProgramsRan元素的HANDLE数组的第一个元素的指针。根据你的描述,这听起来不像是这样,所以我不知道你认为它应该如何运作。

请确保传入指向HANDLE数组的指针(请参阅官方文档)。我不知道information[i].hProcess是什么,但它看起来像是一个结构/类中包含的单个HANDLE成员。虽然如果它是一个单独的HANDLE,我希望它只能处理1个进程,而不是您提到的2个进程。

在此处显示information的定义以及如何初始化/创建流程可能会有所帮助,也可能会将代码缩小到仍能重现问题的最小大小。此外,关于"它失败了"的详细信息可能会有所帮助(错误/异常消息、发生了什么等)。

相关内容

  • 没有找到相关文章

最新更新