Вниз
Скачать: CL | DM;

Проблема с процессами   Найти похожие ветки 

 
Starkom   (2002-09-02 10:52) [0]

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


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

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


 
Skier ©   (2002-09-02 10:54) [2]

>Starkom

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


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


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

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


 
Внук ©   (2002-09-02 11:09) [4]

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


 
Starkom   (2002-09-02 11:15) [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.


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

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


 
Внук ©   (2002-09-02 11:21) [7]

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


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

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


 
Внук ©   (2002-09-02 11:24) [9]

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



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.01 c
1-35755
Eugene
2002-08-29 08:30
2002.09.12
Вопрос про потоки TThread


1-35641
DenKop
2002-09-01 01:19
2002.09.12
Непонятная бредятина с *.dcu


14-35856
AL2002
2002-08-16 18:00
2002.09.12
Чем переконвертить Ogg в Mp3?


1-35635
VSergeySPB
2002-08-30 22:59
2002.09.12
Inage и ListView


1-35707
Mic_2000
2002-09-02 15:21
2002.09.12
как запустить файл с параметрами?




   Наверх