Отслеживание состояния запущенного процесса
Добрый день! Пишу программу на Java. Которая должна вызывать другую программу из своего кода. Далее моя программка должна дождаться когда запущенный ею процесс завершится. Проблема заключается в том, что стандартной функцией waitFor() отследить завершение процесса не удаётся.
Подскажите пожалуйста. Можно ли средствами Java отследить завершение процесса (написать диспетчер задач)? Код:
Runtime runtime = Runtime.getRuntime(); |
Код:
public boolean runProgramAndWait(String runCommand){ |
BlackEric, я так и сделал, но не работает. Возможно, то приложение, которое я вызываю, завершившись, оставляет после себя что то, что свидетельствует для waitFor() о его присутствии.
|
Т.е. у вас Java приложение после вызова waitFor() виснет?
Приложение которое вы вызываете завершается корректно? Если корректно, то waitFor() должен вернуть 0. Что он возвращает? ОС какая и версия Java? <команда для запуска приложения>; - что у вас здесь прописано? Вы с другим приложением пробовали? |
Цитата:
да Цитата:
да Цитата:
Программа как раз на этой функции и весит. Цитата:
ОС Windows XP Pro. Java SDK 1.4, более позднюю версию использовать не желательно. Цитата:
Путь к вызываемой программе, через пробелы параметры. Цитата:
Нет. Мысль хорошая.Приложение которое я вызываю написано на Delphi. |
Я бы на вашем месте отлаживал это на каком-нибудь Hello Word. T.e. добился корректной работы в минимальном приложении типа
Код:
begin |
BlackEric, с Notepad всё работает.
|
Вывод: Java - код рабочий.
Что делает дельфовая прога? Она консольная или с GUI? Нет ли утечек памяти, не закрытых файлов, коннектов к БД и прочая? Народ говорит что может быть проблема если интерфейс со скинами.... |
BlackEric, спасибо. Вроде всё заработало сам не понимаю почему. Хотя ПК слабенькие. Я дождался когда процесс исчезнет в диспетчере задач, но возможно нужно было ещё подождать, что бы процесс выгрузился полностью (может он еще не успел это сделать).
Правда, возникла ещё одна проблема. Моё приложение создаёт потоки, каждый из которых на некотором этапе своего исполнения вызывают функцию общего класса, при этом блокируя (запирая) этот класс (запрещая вызов функции другими процессами). Они в свою очередь ждут пока эта функция освободиться. В этой функции как раз и запускается внешний процесс. Вопрос в том, что функция waitFor() почемуто заставляет ждать всё приложение (а не отдельный поток) пока выполнится внешний процесс. BlackEric, прога GUI. Она выполняет некоторую интеграцию. Конекты с БД есть. Вот как проверить есть ли утечки памяти не знаю. Цитата:
Я обрадовался, что всё заработало, на самом деле получается через раз. |
Цитата:
Как проверять наличие утечек памяти в Delphi посмотрите в гугле. Как объявлена функция которая блокируется и класс в котором она находится? |
Вот так:
Код:
class Mon |
Првильно, если вы вызываете функцию которая объявлена как synchronized, то пока она не выполнится второй раз ее вызвать нельзя.
|
BlackEric, всё так и задумано. Вопрос в том, что когда я вызываю эту функцию из потока, она в свою очередь вызывает внешний модуль. Функция waitFor() заставляет приложение ждать пока внешний модуль выполнится. Но, мне нужно, что бы эта функция заставляла ждать только тот поток который в данный момент получил доступ к public synchronized void Run(String cmd, int i).
Иначе говоря, мне нужно организовать очередь в которую будут попадать потоки желающие вызвать внешний модуль. Нельзя, чтобы его вызывали сразу два потока. |
http://java.sun.com/developer/techni...ing/#Deadlocks
Здесь описано как отлавливать блокировки. Правда для Java 6. Есть ли такое для 1.4 не знаю |
Цитата:
|
В общем как я понял вам нужно для каждого потока для ожидания вызывать метод wait(), а потом когда один поток отработал запускать методом notify() следующий
|
Время: 03:42. |
Время: 03:42.
© OSzone.net 2001-