2011-05-28 112 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的第一個元素的指針。根據你的描述,聽起來並不是這樣,所以我不知道你怎麼想它應該起作用。