Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как определить завершение внешней программы? Завершение всез порожденных процессов 
:(
    Опции темы
ZVano
Дата 1.4.2011, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 259
Регистрация: 11.12.2006
Где: Украина, Кривой Р ог

Репутация: 1
Всего: 4



Из программы А вызываю программу Б.
Программа Б в свою очередь может вызвать программы С1, С2, Сn и завершить свою работу не дожидаясь завершения порожденных процессов.

Вопрос: Как в программе А определить, что все процессы порожденные программой Б завершили свою работу?

Приатачиваю исходник программы(Программа А), которая демонстрирует данный процесс.
В папке \RUN\ лежат bat-файлы, которые вызываются разными методами из программы А.
Некоторые батники в свою очередь вызывают дочерние программы.
DoPause.bat - батник ничего из себя не вызывает. Просто висит, пока не закроеш. Его завершение отлавливается корректно.
CallCalc.bat - вызывает калькулятор и ждет его завершения. Отрабатывается корректно.
StartDoPause.bat - вызывает "DoPause.bat" и не дожидаясь его выполнения передает управление программе А. !!!Этот случай нужно обработать.
StartCalc.bat - вызывает калькулятор и не дожидаясь его выполнения передает управление программе А. !!!Этот случай нужно обработать.


Помогите, плиз. Голова уже разламывается.

Добавлено через 7 минут и 13 секунд
Этот кусок кода не подходит т.к. отслеживается завершение процесса Б, но не учитываются процессы порожденные от Б.
Код

LogAddLine("CreateProcessW::Beg");
STARTUPINFOW startupInfo;
PROCESS_INFORMATION processInfo;
GetStartupInfoW(&startupInfo);
UnicodeString fPathW = "C:\\WINDOWS\\system32\\calc.exe"

bool runResult = CreateProcessW( //
  NULL //
  , fPathW.w_str() //
  , NULL //
  , NULL //
  , false //
  , NULL //
  , NULL //
  , NULL //
  , &startupInfo //
  , &processInfo //
  ) == true;

if (!runResult) {
  LogAddLine("Не получилось запустить процесс");
  return;
}
LogAddLine( //
  UnicodeString::Format("Информация процесса: hProcess=<%d> hThread=<%d> dwProcessId=<%d> dwThreadId=<%d>", //
    OPENARRAY( //
      TVarRec, ( //
        (int)processInfo.hProcess //
        , (int)processInfo.hThread //
        , processInfo.dwProcessId //
        , processInfo.dwThreadId //
      ) //
    ) //
  ) //
  );
while (true) {
  DWORD exitCode = 0;
  if (!GetExitCodeProcess(processInfo.hProcess, &exitCode)) {
    // if (!GetExitCodeThread(processInfo.hThread, &exitCode))
    LogAddLine("Не получилось обратиться к процессу");
    break;
  }
  if (exitCode != STILL_ACTIVE) {
    LogAddLine("Умерло... выход");
    break;
  }
  else {
    LogAddLine("Живо... ожидаем");
    Application->ProcessMessages();
    Sleep(1000);
  }
}
LogAddLine("CreateProcessW::End");


Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  TasksRun_001.zip 27,14 Kb


--------------------
НЕ ФЛУДИМ. Пользуемся кнопками "+" или "-" для выражения своего отношения к теме или сообщению.
Гуглим "Как правильно задавать вопросы"
PM MAIL Skype   Вверх
ИванМ
Дата 13.4.2011, 09:31 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 5
Всего: 23



Как вариант, пройтись по всем запущенным процессам с помощью CreateToolhelp32Snapshot, узнать, какие из них являются наледниками B и соотвественно с ними уже работать.
PM MAIL   Вверх
xvr
Дата 13.4.2011, 11:33 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(ИванМ @ 13.4.2011,  09:31)
Как вариант, пройтись по всем запущенным процессам с помощью CreateToolhelp32Snapshot, узнать, какие из них являются наледниками B и соотвественно с ними уже работать.

Если В успел быстренько наплодить потомков и помереть, перед тем как начали звать CreateToolhelp32Snapshot, то уже ничего не узнаешь  smile Ситуация усложняется еще тем, что это может произойти в любой момент времени (и произойдет, т.к. сам В не ждет своих потомков, а значит есть большая вероятность, что он завершится сразу после создания последнего. А вероятность того, что вызов CreateToolhelp32Snapshot попадет в этот небольшой временной интервал, исчезающе мала  smile )

PM MAIL   Вверх
ZVano
Дата 15.4.2011, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 259
Регистрация: 11.12.2006
Где: Украина, Кривой Р ог

Репутация: 1
Всего: 4



Наткнулся на API IsChild, но не проверял на работоспособность т.к. другим шибко занят, а 1е задание сделал по-иному.

Функция IsChild
--------------------------------------------------------------------------------
Функция IsChild проверяет, является ли окно дочерним окном или порожденным окном заданного родительского окна. Дочернее окно - прямой потомок определяемого родительского окна, если это родительское окно находится в цепочке родительских окон; цепочка родительских окон управляет в диапазоне от оригинала перекрывающего или выскакивающего окна до дочернего окна.

Синтаксис
Код

BOOL IsChild( 

HWND hWndParent, // дескриптор родительского окна
HWND hWnd        // дескриптор окна для проверки

);

Параметры

hWndParent

[in] Дескриптор родительского окна.

hWnd

[in] Дескриптор окна, которое будет проверяться.

Возвращаемые значения

Если окно - дочернее или порожденное окно заданного родительского окна, возвращаемое значение не нуль.

Если окно - не дочернее или порожденное окно заданного родительского окна, возвращаемое значение нулевое.


--------------------
НЕ ФЛУДИМ. Пользуемся кнопками "+" или "-" для выражения своего отношения к теме или сообщению.
Гуглим "Как правильно задавать вопросы"
PM MAIL Skype   Вверх
xvr
Дата 15.4.2011, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(ZVano @  15.4.2011,  15:56 Найти цитируемый пост)
Функция IsChild проверяет, является ли окно дочерним окном или порожденным окном заданного родительского окна.

Угу, и к процессам она не имеет никакого отношения. Окно не может быть дочерним окном окна из другого процесса

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0436 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.