WaitForMultipleObjects funktioniert nicht richtig??
-
Hallo,
ich habe folgendes Problem:
Ich habe 3 Prozesse mit CreateProcess erzeugt (die z.b. calc, mspaint und cmd ausführen).
Dazu habe ich mir die Handles aller erzeugten Prozesse in einem HANDLE array (hnd) gespeichert.Nun woll ich mit Hilfe von res = WaitForMultipleObjects(3, hnd, FALSE,INFINITE) solange warten bis ein Prozess beendet wird, wobei laut doku res den index des Arrays zurück gibt...
Das ganze passiert in eine Schleife. Das "INFINITE" bedeutet ja, das er solange wartet bis ein Prozess beendet wurde...da dies in einer Schleife passiert müsste er doch nachdem ein Prozess beendet wurde wieder auf den nächsten warten..
Das passiert aber nicht. Er warten am Anfang und sobald ich ein Prozess beende, zeigt er mir sogar den richtigen Index an, aber er wartet nicht auf den nächsten...Also er kehrt sofort aus der Funktion wieder zurück...Warum??
Hier is der Code:
STARTUPINFO sInfo; PROCESS_INFORMATION pInfo; HANDLE hnd[3]; ZeroMemory( &sInfo, sizeof(sInfo) ); sInfo.cb = sizeof( sInfo ); ZeroMemory( &pInfo, sizeof(pInfo) ); if( argc < 2 ) { printf("Aufruf: %s [Programm1, Programm2, ...]\n", argv[0]); return -1; } wchar_t wszTemp[100]; for (int i = 1; i< argc; i++) { MultiByteToWideChar(CP_ACP, 0, argv[i], -1, wszTemp, sizeof(wszTemp) / sizeof(wchar_t)); if( !CreateProcess( NULL, wszTemp, NULL, NULL, FALSE, 0, NULL, NULL, &sInfo, &pInfo ) ) { printf( "\nFehler"); } else { hnd[i] = pInfo.hProcess; } } DWORD dwResult; while(1) { dwResult = WaitForMultipleObjects(3, hnd, FALSE,INFINITE); printf("Prozess mit Index %d wurde beendet\n",dwResult); }
-
Ist ein Handle erstmal signalisiert, bleibt es signalisiert. D.h. ein erneutes WaitForMultipleObjects(..) bringt wieder dasselbe signalisierte Handle.
Entferne das signalisierte Handle aus dem Array, dann wird auf die Beednigung des nächsten Prozesses gewartet.
Simon
-
das habe ich schon gemacht,
ohne erfolg...
oder ich hab was falsch entfernt..wie mach ich das am besten?
-
Zeig doch mal wie du das gemacht hast...
-
ich habe das erstmal testweise so gemacht, das ich mir ein zweites array erzeugt habe, mit einem element weniger, also das 3. Handle fehlt:
HANDLE hnd2[2]; memcpy(hnd2,hnd,2); dwResult = WaitForMultipleObjects(3, hnd, FALSE,INFINITE); printf("Prozess mit Index %d wurde beendet\n",dwResult); dwResult = WaitForMultipleObjects(2, hnd2, FALSE,INFINITE); printf("Prozess mit Index %d wurde beendet\n",dwResult);ich hab dann den 3. Prozess zuerst beendet, es ist dann also nicht mehr in hnd2 drin....aber beim zweiten wait wartet er trotzdem nich..
-
Hallo Feldmaus,
int handlenum = 0; for (int i = 1; i< argc; i++) { ... if( !CreateProcess... {...} else { hnd[handlenum++] = pInfo.hProcess; CloseHandle(pInfo.hThread); // vergessen? } } while (handlenum) { dwResult = WaitForMultipleObjects(handlenum, hnd, FALSE, INFINITE); printf("Prozess mit Index %d wurde beendet\n", dwResult); CloseHandle(hnd[dwResult]); hnd[dwResult] = hnd[--handlenum]; // handle[terminated] = handle[last] }
-
Hier ein Bsp.
Anstelle von Prozess Handles habe ich hier Thread Handles genommen. Spielt aber für die Logik keine Rolle.DWORD WINAPI threadProc(LPVOID /*arg*/) { Sleep(2000); return 0; } int main() { HANDLE hHandles[4]; hHandles[0] = CreateThread(0, 0, &threadProc, 0, 0, 0); hHandles[1] = CreateThread(0, 0, &threadProc, 0, 0, 0); hHandles[2] = CreateThread(0, 0, &threadProc, 0, 0, 0); hHandles[3] = CreateThread(0, 0, &threadProc, 0, 0, 0); DWORD nCount = 4; while (nCount > 0) { DWORD dwResult = WaitForMultipleObjects(nCount, hHandles, FALSE, INFINITE); DWORD index = dwResult - WAIT_OBJECT_0; CloseHandle(hHandles[index]); hHandles[index] = 0; for (DWORD i = index; i < nCount; ++i) { if (i < nCount - 1) { hHandles[i] = hHandles[i + 1]; } else { hHandles[i] = 0; } } --nCount; } }
-
Danke euch beiden,
hat geklappt