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 это терпит неудачу.

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

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

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);

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

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

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

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

Другие вопросы по тегам