WaitForMultipleObjects терпит неудачу c ++ - PullRequest
1 голос
/ 29 мая 2011

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

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

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

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

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

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

Ответы [ 3 ]

5 голосов
/ 29 мая 2011

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

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

3 голосов
/ 29 мая 2011

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

2 голосов
/ 29 мая 2011

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

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

...