WaitForMultipleObjects使c ++失败

Joh*_*ton 1 c++ winapi multithreading 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失败.

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

谢谢你的帮助

Guy*_*ton 5

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

WaitForMultipleObjects(1, &information[i].hProcess, TRUE, INFINITE)
Run Code Online (Sandbox Code Playgroud)

如果您使用除1之外的任何内容,请查看PROCESS_INFORMATION的定义:

typedef struct _PROCESS_INFORMATION {
  HANDLE hProcess;
  HANDLE hThread;
  DWORD  dwProcessId;
  DWORD  dwThreadId;
} PROCESS_INFORMATION, *LPPROCESS_INFORMATION;
Run Code Online (Sandbox Code Playgroud)

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

就像是:

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

将等待所有进程.