Ошибка WaitForMultipleObjects С++

В настоящее время я пишу программу, которая будет запускать сразу несколько программ в группах, а другие - по отдельности.

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

numberOfProgramsRan — это количество программ, которые я запускал в своем цикле. &information[i] - это vector, содержащий информацию о моем процессе из процесса создания

Когда я создаю процесс в цикле for, моя программа будет ждать, если будет создано два или меньше процессов (таким образом, две программы передаются для запуска), прежде чем запускать мои следующие процессы. Если создать более двух процессов (или передать более двух программ в моем векторе), мой WaitForMultipleObjects выйдет из строя.

Если мне нужно более подробно объяснить мою проблему, пожалуйста, дайте мне знать.

Спасибо за вашу помощь


person Johnston    schedule 28.05.2011    source источник
comment
Вы смотрели на результат GetLastError()?   -  person cpx    schedule 29.05.2011
comment
Я бы не ожидал, что &information[i].hProcess будет правильным. Можете ли вы показать нам декларацию information?   -  person Gabe    schedule 29.05.2011
comment
PROCESS_INFORMATION пи = {0}; информация.push_back(пи); затем я использую информацию [i] insead pi в процессе создания   -  person Johnston    schedule 29.05.2011
comment
@Johnston В этом случае numberOfProgramsRan должно быть только 1, так как будет только одна информация [i].hProcess   -  person nos    schedule 29.05.2011
comment
@nos я зацикливаю его, чтобы запустить все процессы в векторе   -  person Johnston    schedule 29.05.2011
comment
Вы передаете ему указатель на дескриптор первого процесса. Как вы ожидаете, что он найдет указатель на дескриптор второго процесса?   -  person Gabe    schedule 29.05.2011
comment
В итоге я загрузил свою векторную информацию в массив, а затем поместил этот массив в ожидание множественного числа вместо &information[i]. Я также больше не зацикливаюсь на ожидании нескольких, поскольку, как я понял, это было бессмысленно. Спасибо за помощь, и я хотел бы выбрать более одного правильного ответа, так как вы все дали полезную информацию. Спасибо!   -  person Johnston    schedule 30.05.2011


Ответы (3)


Если вы ждете только один процесс (индекс 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);

Буду ждать всех ваших процессов.

person Guy Sirton    schedule 28.05.2011
comment
&hProcess[0]? Действительно? Просто скажите hProcess. - person asveikau; 29.05.2011
comment
Хорошее объяснение того, почему 2 работает... потому что он ожидает как процесс, так и поток. - person Ben Voigt; 29.05.2011

Этот &information[i].hProcess должен быть указателем на первый элемент массива HANDLE, который содержит numberOfProgramsRan элементов. Судя по вашему описанию, это не так, поэтому я не знаю, как вы представляете, что это должно работать.

person Öö Tiib    schedule 28.05.2011

Убедитесь, что вы передаете указатель на массив HANDLE (см. официальная документация). Я не знаю, что такое information[i].hProcess, но это похоже на один член HANDLE, содержащийся в структуре/классе. Хотя, если бы это был один HANDLE, я бы ожидал, что он будет работать только с 1 процессом, а не с 2, как вы упомянули.

Показ определения information и того, как вы инициализируете/создаете процессы здесь, может помочь, а также уменьшить размер кода до минимального размера, который по-прежнему воспроизводит проблему. Также могут помочь подробности о «сбое» (сообщение об ошибке/исключении, что происходит и т. д.).

person uesp    schedule 28.05.2011