Я пишу программу в java, которая может запускать такие приложения, как, например, firefox.
Изменение: эта программа предназначена для Linux, в частности ubuntu.
Легко запустить программу:
Runtime.getRuntime().exec("/usr/bin/firefox");
Тем не менее, я хочу получить детали из окна, как только он будет полностью открыт или запущен.
На данный момент я просто звоню:
Thread.sleep(delay);
Чтобы убедиться, что окно готово, но это плохое решение. Проблема в том, что разные окна требуют разных задержек.
Беспорядочный.
Итак, мой вопрос в том, есть ли способ, которым я могу быть уведомлен, когда firefox (или любое другое внешнее приложение, если на то пошло) полностью настроено? Я не думаю, что могу использовать Process.waitFor(), потому что процесс не будет завершен до тех пор, пока Firefox не будет закрыт.
Заранее спасибо!
Обновление: Process.waitFor() не работает. Я пробовал это, и он возвращается только тогда, когда firefox закрыт, а не когда он полностью настроен. Только для тех, кто пытается это сделать самостоятельно, если другое окно firefox уже открыто, это сработает (что сначала обмануло меня), но если нет существующего окна, это не будет!
Хорошо, я делал несколько размышлений, и у меня есть достаточно удовлетворительный ответ.
Вместо того, чтобы ждать, пока окно будет готово, постоянно ищите его с помощью 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 выплюнет ошибку плохого окна, и читатель прочитает это.
Тем не менее, кажется, почти быстрее использовать стандартную задержку, как я говорил выше, но это решение будет работать даже для окон, которые занимают больше времени для загрузки, вместо того, чтобы пытаться угадать задержку.
Вы можете использовать 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
}