Запустите процесс как синхронную операцию из приложения Win32 - PullRequest
2 голосов
/ 28 июля 2010

У меня есть служебное приложение, назовем его util.exe.Это инструмент командной строки, который принимает входные данные из командной строки и создает файл на диске, скажем, файл образа

. Я хочу использовать это в другом приложении, запустив util.exe.Однако он должен быть синхронным, поэтому известно, что файл существует, когда обработка продолжается.

например (psudeo)

bool CreateImageFile(params)
{
  //ret is util.exe program exit code
  int ret = runprocess("util.exe",params);
  return ret==0;
}

Существует ли один вызов API Win32, который будет запускать процесс и ждатьпока это не кончится?Я посмотрел на CreateProcess, но он возвращается, как только он пытается запуститься, я посмотрел на ShellExecute, но это кажется немного уродливым, даже если были синхронными.

Ответы [ 2 ]

4 голосов
/ 28 июля 2010

Нет ни одного API, но на самом деле это более интересный вопрос для приложений Win32. Вы можете использовать CreateProcess или ShellExecuteEx и WaitForSingleObject в дескрипторе процесса. GetExitCodeProcess в этот момент выдаст вам код завершения программы. См. здесь для простого примера кода.

Однако это полностью блокирует ваш основной поток и может привести к серьезным проблемам с блокировкой при некоторых сценариях обмена сообщениями Win32. Допустим, порожденный exe-файл отправляет сообщение. Это не может продолжаться, пока все окна не обработают сообщение - но вы не можете продолжить, потому что вы заблокированы, ожидая его. Тупик. Поскольку вы используете только программы командной строки, эта проблема, вероятно, не относится к вам. Вас волнует, зависает ли программа командной строки на некоторое время?

Лучшее общее решение для обычных приложений - это, вероятно, разделить запуск и ожидание процесса на поток и отправить сообщение обратно в главное окно, когда поток завершится. Когда вы получаете сообщение, вы знаете, что продолжить безопасно, и никаких проблем с тупиком нет.

2 голосов
/ 28 июля 2010

Дескриптор процесса - ожидаемый объект, AFAIK. Это именно то, что вам нужно.

Однако я бы рекомендовал не делать ничего подобного. Процесс запуска в Windows может быть медленным, и это заблокирует ваш пользовательский интерфейс. Рассмотрим цикл PeekMessage с таймаутами ожидания 50 мс, чтобы сделать это из приложения Windows.

...