Форум: "Основная";
Текущий архив: 2002.09.12;
Скачать: [xml.tar.bz2];
ВнизПроблема с процессами Найти похожие ветки
← →
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 вся ветка
Форум: "Основная";
Текущий архив: 2002.09.12;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.008 c