2011-05-28 85 views
1

我目前正在编写一个程序,它可以一次运行多个程序,并且可以一次运行多个程序。WaitForMultipleObjects失败C++

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

numberOfProgramsRan是的,我在我的循环运行程序的数量。 &information[i]是前vector从创建过程

握着我的过程信息,当我在一个for循环建立的过程中我的程序将等待是否有创建(因此被传递两个程序在运行)两个或更少的过程它运行我的下一个进程。 如果创建两个以上的进程(或者传入我的向量中的两个以上程序),我的WaitForMultipleObjects失败。

如果我需要进一步解释我的问题,请让我知道。

感谢您的帮助

+1

你看过'GetLastError()'的结果吗? – cpx 2011-05-28 22:43:06

+0

我不希望'&information [i] .hProcess'是正确的。你能告诉我们“信息”的声明吗? – Gabe 2011-05-28 22:49:12

+0

PROCESS_INFORMATION pi = {0}; information.push_back(pi); 然后我在创建过程中使用信息[i] insead pi – Johnston 2011-05-28 22:56:31

回答

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

'&hProcess [0]'?真?只要说'hProcess'。 – asveikau 2011-05-29 00:14:19

+0

为什么2似乎工作的好解释...因为它在进程和线程上都在等待。 – 2011-05-29 00:15:59

+0

@asveikau:好的,好的:-) – 2011-05-29 00:28:13

2

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

显示information的定义以及如何在这里初始化/创建过程可能会有所帮助,并且可以将代码缩小到仍能再现问题的最小大小。关于“失败”的细节可能会有所帮助(错误/异常消息,发生了什么,等等)。

3

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