C, создавать процессы и ждать - PullRequest
1 голос
/ 13 сентября 2011

Привет! Я создаю несколько процессов с помощью CreateProcess, и мне нужно подождать, пока все они завершатся, чтобы проанализировать результаты.

И я не могу подождать WaitForSingleObject, потому что мне нужны все процессы, запущенные нав то же время.

Поскольку каждый процесс имеет дескриптор на Process_Information (hProcess), я подумал, что можно использовать WaitForMultipleObjects , но родительский процесс завершается без ожиданияребенок.Можно ли использовать WaitForMultipleObjects или есть лучший способ?

Вот как я создаю процессы:

#define MAX_PROCESS 3

STARTUPINFO si[MAX_PROCESS];
PROCESS_INFORMATION pi[MAX_PROCESS];
WIN32_FIND_DATA fileData;
HANDLE find;

int j=0, t=0;

ZeroMemory(&si, sizeof(si));


for (t = 0; t < MAX_PROCESS; t++)
    si[t].cb = sizeof(si[0]);

ZeroMemory(&pi, sizeof(pi));    

while (FindNextFile(find, &fileData) != 0) 
{
    // Start the child process. 
    if (!CreateProcess(_T("C:\\Users\\Kumppler\\Documents\\Visual Studio 2010\\Projects\  \teste3\\Debug\\teste3.exe"),   // No module name (use command line)
                       aux2,           // Command line
                       NULL,           // Process handle not inheritable
                       NULL,           // Thread handle not inheritable
                       TRUE,           // Set handle inheritance to FALSE
                       0,              // No creation flags
                       NULL,           // Use parent's environment block
                       NULL,           // Use parent's starting directory 
                       &si[j],         // Pointer to STARTUPINFO structure
                       &pi[j])         // Pointer to PROCESS_INFORMATION structure
       ) 
    {
        printf("CreateProcess failed (%d).\n", GetLastError());
        return;
    }
    j++;

    //find next file related

}       
FindClose(find);        

WaitForMultipleObjects(MAX_PROCESS, &pi[j].hProcess, FALSE, INFINITE);
//wait and analyze results

Кстати, я пытаюсь не использовать потоки.

Ответы [ 2 ]

3 голосов
/ 13 сентября 2011

WaitForMultipleObjects ожидает массив дескрипторов:

HANDLE hanldes[MAX_PROCESS];
for (int i = 0; i < MAX_PROCESS; ++i)
{
  handles[i] = pi[i].hProcess;
}

WaitForMultipleObjects(MAX_PROCESS, handles, TRUE, INFINITE);

Также вы должны знать, что максимальный размер массива дескрипторов для WaitForMultipleObjects ограничен MAXIMUM_WAIT_OBJECTS (который равен 64).

2 голосов
/ 13 сентября 2011

Если вы хотите подождать, пока все РУЧКИ установите 'bWaitAll' (третий параметр) в 'ИСТИНА'.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...