Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблема с процессами [D5, WinXP]


Starkom ©   (2002-09-02 10:52:00) 

Есть основной процесс, который порождает дочерний процесс. Оба процесса активно обмениваются данными. Когда дочерний процесс заканчивается, то он посылает сообщение основному процессу. Сделано это для того, чтобы не дать пользователю закрыть приложение основного процесса в то время, когда запущен дочерний.
Проблема в том, что, если дочерний процесс вызывает ошибку, то он убивается системой и посылки сообщения основному процессу не происходит. В результате основное приложение нельзя закрыть!
Как мне из основного приложения отследить такой случай, когда система убивает дочерний процесс.


Виктор Щербаков   (2002-09-02 11:24:00) [1]

Можно еще GetExitCodeProcess. И смотреть вернет ли она STILL_ACTIVE.


Внук   (2002-09-02 11:24:00) [2]

Также можно использовать GetExitCodeProcess(b.hProcess,...)
которая вернет STILL_ACTIVE для дочернего процесса, если он еще жив


Внук   (2002-09-02 11:21:00) [3]

Не нужно закрывать описатель процесса CloseHandle(b.hProcess); - убрать
Идентификатор процесса в принципе не нужен, наверно.
WaitForSingleObject(b.hProcess,0) вернет WAIT_TIMEOUT, если дочерний процесс не завершен еще


Dimk   (2002-09-02 11:19:00) [4]

Да, и если вызвать функцию типа WaitOnSingleObject
если процесс завершен - то вернется WAIT_OBJECT_0 - то есть дождались мол :0)


Starkom   (2002-09-02 11:15:00) [5]

то есть использовать параметр CreateProcess()"a? -
LPPROCESS_INFORMATION lpProcessInformation // pointer to PROCESS_INFORMATION
у меня такой запуск процесса:
CreateProcess(nil,PChar("lalala.exe "+IntToStr(FormNumber)),nil,nil,false,CREATE_DEFAULT_ERROR_MODE,nil,nil,a,b);
ProcessHandle:=b.dwProcessId;
CloseHandle(b.hThread);
CloseHandle(b.hProcess);
Этот ProcessHandle вроде и есть глобальный идентификатор процесса.
А чем проверять то? Ищу-ищу, не могу найти, как можно использовать этот ProcessHandle.


Внук   (2002-09-02 11:09:00) [6]

Используй CreateProcess и владей им в полной мере :)


Starkom   (2002-09-02 10:58:00) [7]

2 Skier: полностью переписать дочерний процесс нет возможности :((
2 Виталий Щербаков: А как? Процесс запуска дочернего процесса выглядит так - запуск exe-файла с параметром. В зависимости от параметра, порожденное окно может быть каким угодно, то есть FindWindow не подходит.


Виктор Щербаков   (2002-09-02 10:54:00) [8]

При попытке закрытия основного процесса, проверяй существует ли дочерний...


Skier   (2002-09-02 10:54:00) [9]

>Starkom

> Проблема в том, что, если дочерний процесс вызывает ошибку,
> то он убивается системой и посылки сообщения основному процессу
> не происходит.


А может стоит сделать так чтобы дочерний процесс не вызывал ошибку...Это как-то надёжней :)


Наверх

Титульная страница Поиск, карта сайта Написать письмо