Получать уведомления, когда внешнее приложение полностью запущено - Java

1

Я пишу программу в java, которая может запускать такие приложения, как, например, firefox.

Изменение: эта программа предназначена для Linux, в частности ubuntu.

Легко запустить программу:

Runtime.getRuntime().exec("/usr/bin/firefox");

Тем не менее, я хочу получить детали из окна, как только он будет полностью открыт или запущен.

На данный момент я просто звоню:

Thread.sleep(delay);

Чтобы убедиться, что окно готово, но это плохое решение. Проблема в том, что разные окна требуют разных задержек.

Беспорядочный.

Итак, мой вопрос в том, есть ли способ, которым я могу быть уведомлен, когда firefox (или любое другое внешнее приложение, если на то пошло) полностью настроено? Я не думаю, что могу использовать Process.waitFor(), потому что процесс не будет завершен до тех пор, пока Firefox не будет закрыт.

Заранее спасибо!

Обновление: Process.waitFor() не работает. Я пробовал это, и он возвращается только тогда, когда firefox закрыт, а не когда он полностью настроен. Только для тех, кто пытается это сделать самостоятельно, если другое окно firefox уже открыто, это сработает (что сначала обмануло меня), но если нет существующего окна, это не будет!

  • 1
    Я не знаю, как вы можете сделать это в Linux, в Windows мы должны были бы проверить, открыто ли окно, связанное с этой программой (через JNI). В Linux я знаю только о состояниях процесса: «Бег», «Ожидание» или «Спящий», «Остановлен» и «Зомби» », и ни одна из них не содержит нужной вам информации. Возможно, вам придется поступить так же, как мы делаем в Windows с некоторым API.
Теги:
runtime.exec

2 ответа

0
Лучший ответ

Хорошо, я делал несколько размышлений, и у меня есть достаточно удовлетворительный ответ.

Вместо того, чтобы ждать, пока окно будет готово, постоянно ищите его с помощью xdotool:

while(line == null){
        writer.write("xdotool search --onlyvisible --name " + name + "\n");
        writer.flush();
        if(reader.ready())
            line = reader.readLine();

        Thread.sleep(1000);
}

xdotool будет печатать только строку, если она найдет окно с именем name.

Поэтому, если читатель готов(), вы знаете, что окно открыто.

Thread.sleep() необходим, потому что, если он отсутствует, xdotool выплюнет ошибку плохого окна, и читатель прочитает это.

Тем не менее, кажется, почти быстрее использовать стандартную задержку, как я говорил выше, но это решение будет работать даже для окон, которые занимают больше времени для загрузки, вместо того, чтобы пытаться угадать задержку.

1

Вы можете использовать Process#waitFor чтобы дождаться выполнения команды, а затем проверьте exitValue следующим образом:

Process p = Runtime.getRuntime().exec("/usr/bin/firefox");
p.waitFor();

if(p.exitValue()==0) {

  //success
} else {
  // fail read error stream or out stream for possible causes
}
  • 0
    Это не работает. Как я уже сказал в вопросе, он будет ждать, пока приложение будет закрыто, а затем вернется. Мне нужно, чтобы он вернулся после завершения настройки приложения. Он будет работать, если уже открыто окно Firefox (или какой-либо внешней программы), но в противном случае это не так.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню