Вниз
Скачать: 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.012 c
14-35894
kalenih
2002-08-19 14:09
2002.09.12
Привет


14-35920
Дремучий
2002-08-16 17:09
2002.09.12
есть сервера где хранятся копии (снимки) сайтов....


14-35906
Владимир Шевченко
2002-08-16 14:53
2002.09.12
Form1.Query Format


3-35548
Shoo
2002-08-21 15:51
2002.09.12
Выборка части значения поля


1-35633
Strela
2002-08-30 01:18
2002.09.12
Динамическое создание объекта




   Наверх