【问题标题】:WaitForMultipleObjects failing c++WaitForMultipleObjects 失败 C++
【发布时间】:2011-05-28 22:38:59
【问题描述】:

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

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

numberOfProgramsRan 是我在循环中运行的程序数。 &amp;information[i] 是一个 vector 持有我的创建过程中的过程信息

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

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

感谢您的帮助

【问题讨论】:

  • 你看过GetLastError()的结果了吗?
  • 我不希望&amp;information[i].hProcess 是正确的。可以给我们看一下information的声明吗?
  • PROCESS_INFORMATION pi = {0};信息.push_back(pi);然后我在创建过程中使用 information[i] insead pi
  • @Johnston 如果是这样的话,numberOfProgramsRan 应该永远只有 1,因为只有一个 information[i].hProcess
  • @nos i 循环它以在向量中的所有进程上运行

标签: c++ multithreading winapi concurrent-programming


【解决方案1】:

如果你只等待一个进程(索引 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);

将等待您的所有进程。

【讨论】:

  • &amp;hProcess[0]?真的吗?直接说hProcess
  • 很好地解释了为什么 2 似乎可以工作......因为它同时等待进程和线程。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多