1

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

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

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

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

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

谢谢你的帮助

4

3 回答 3

5

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

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);

将等待您的所有进程。

于 2011-05-28T23:10:21.213 回答
3

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

于 2011-05-28T22:50:24.187 回答
2

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

在此处显示流程的定义information以及您如何初始化/创建流程可能会有所帮助,并将代码减少到仍然重现问题的最小大小。此外,有关“失败”的详细信息可能会有所帮助(错误/异常消息、发生的情况等......)。

于 2011-05-28T22:49:36.490 回答