WaitForMultipleObjects使c ++失败

时间:2011-05-28 22:39:00

标签: c++ multithreading winapi concurrent-programming

我目前正在编写一个程序,它将同时运行多个程序,而其他程序则自行运行。

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

numberOfProgramsRan是我在循环中运行的程序数。 &information[i]是一个vector,其中包含我创建流程中的流程信息

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

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

感谢您的帮助

3 个答案:

答案 0 :(得分: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);

将等待您的所有流程。

答案 1 :(得分:3)

&information[i].hProcess应指向包含HANDLE元素的numberOfProgramsRan数组的第一个元素。根据你的描述,听起来并不是这样,所以我不知道你怎么想它应该工作。

答案 2 :(得分:2)

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

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