Proc.wait

  • Автор темы allex
  • Дата начала
A

allex

#1
Имеется
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">код</div></div><div class="sp-body"><div class="sp-content">
Код:
String cmd[] = { "c:\\Program Files (x86)\\LibreOffice 3.4\\program\\soffice.exe","i:\\Бланк.odt" };
ProcessBuilder pb = new ProcessBuilder(cmd); 
pb.redirectErrorStream(true); 
try { 
Process p = pb.start(); 
String s; 
// read from the process's combined stdout & stderr 
BufferedReader stdout = new BufferedReader ( 
new InputStreamReader(p.getInputStream())); 
while ((s = stdout.readLine()) != null) { 
System.out.println(s); 
} 
System.out.println("Exit value: " + p.waitFor()); 
p.getInputStream().close(); 
p.getOutputStream().close(); 
p.getErrorStream().close(); 
} catch (Exception ex) { 
ex.printStackTrace(System.out); 
}
который при компиляции и выполнении в консоли отрабатывает как надо, но ....

при компиляции и выполнении этого же кода (находящегося в библиотеках базы) через бридж LS2J не хочет ждать .waitFor()

Почему существует разница в выполнении одного и того же кода ?
 

nvyush

Lotus team
22.04.2009
2 317
0
#2
при компиляции и выполнении этого же кода (находящегося в библиотеках базы) через бридж LS2J не хочет ждать .waitFor()
Некоторое время назад мучился подобным вопросом, победить не смог. Видимо у потока ls своя жизнь, у потока java — своя...
 
A

allex

#3
А вот если этот код в агенте замутить, то работает отлично.
Придетс подшаманить ...
 

VladSh

начинающий
Lotus team
11.12.2009
1 262
6
#4
при ... выполнении этого же кода (находящегося в библиотеках базы) через бридж LS2J не хочет ждать .waitFor()
А вот если этот код в агенте замутить, то работает отлично.
Ждёт ли из LS-агента через LS2J? Получилось?
 

VladSh

начинающий
Lotus team
11.12.2009
1 262
6
#5
Кстати да, из агента ждёт. Но есть неприятный трабл..
Задача: обновление некоторого ПО, к dll которого подключаемся из LS обычными декларациями.
Сначала я подключаю эту библу, где декларации функций dll и вызываю функцию инициализации, чем определяю, если ли вообще эти dll, и если есть, то стоит ли их обновлять.
После этого я грохаю объект, который инициализировал и через LS2J и waitFor запускаю инсталятор. При установке получаю сообщение, что dll не может быть заменена, т.к. сейчас занята.
Тот же результат (сообщение о занятости) получаю, если в цикле "засыпаю" на 1 сек и пытаюсь удалить файл инсталятора (его надо удалить после обновления).
Работает только когда вызываю обычный Shell, т.е. скрипт (агент) сразу же завершает работу отпуская задекларированные и проинициализированные в подключаемой библе dll (то, что я перед запуском инсталятора делаю Delete объекту, содержащему вызовы функций из dll, - по барабану).
Интересны сообращения комьюнити, как обойти эту ситуёвину /проверка инициализации в "отдельном потоке" через Execute в голову приходила, но не хотелось бы так уж заморачиваться, т.к. работа с dll через Execute особо радости не приносит.../.
 

VladSh

начинающий
Lotus team
11.12.2009
1 262
6
#6
Решил разбивкой на 2 агента:
1 - вызов функции инициализации, для определения, если ли вообще эти dll.
2 - загрузка и установка.
Первый агент, вызывая в конце кода второго, сам завершается, чем "отпускает" dll'и.
 

VladSh

начинающий
Lotus team
11.12.2009
1 262
6
#7
На Win7, где нет прав администратора, код на Java (через LS2J), запускающий exe'шник, "сбрасывается".
Если запустить вручную, то вылетает окно "Разрешаете ли запустить этот файл?.." Если из кода, то ничего не происходит. Интересно, каким образом можно запустить exe'шник из Java, чтобы вылетело это окно и всё дальше нормально отработалось?

P.S. К стати, с "отпусканием" dll и waitFor() тоже не всё ясно. На одних компах работает, на других нет.. Дома Win7 x64 (правда с админ-правами) и любая из 8.5.x-версий Лотуса - всё работает, даже с одним агентом, и dll отпускает... и есть куча машин x32, где не работает..
 

VladSh

начинающий
Lotus team
11.12.2009
1 262
6
#8
Ещё одна смежная тема.
Пытаюсь сделать так, чтобы код не клинил Клиента.
Если запускать с помощью bat, js, vbs, то всё работает отлично - создаётся новый процесс от ОС, не влияющий на мой основной процесс. Вроде бы всё хорошо, но неохота ещё париться с этими "командными" файлами.
Пробую создать отдельный процесс:
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">типа того</div></div><div class="sp-body"><div class="sp-content"><!--shcode--><pre><code class='java'> public static boolean exec(String[] cmd, boolean bWait) {
Process process = null;
Runtime runtime;
try {
runtime = Runtime.getRuntime();
process = runtime.exec(cmd);
if (bWait)
process.waitFor();

return true;
}
catch (InterruptedException ei) {

}
catch (Exception e) {

}
finally {
if (process != null)
process.destroy();
runtime = null;
}
return false;
}

// стартуем асинхронно
public static void execA(final String[] cmd, final boolean bWait) {
new Thread(new Runnable() {
public void run() {
exec(cmd, bWait);
}
}).start();
}
}[/CODE]но вываливается:
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">ошибка</div></div><div class="sp-body"><div class="sp-content">
Exception in thread "Thread-8" java.lang.NoClassDefFoundError: java.lang.ProcessEnvironment (initialization failure)
at java.lang.J9VMInternals.initialize(J9VMInternals.java:140)
at java.lang.ProcessImpl.start(ProcessImpl.java:40)
at java.lang.ProcessBuilder.start(ProcessBuilder.java:464)
at java.lang.Runtime.exec(Runtime.java:604)
at java.lang.Runtime.exec(Runtime.java:477)
at JProcess.execute(Unknown Source)
at JProcess$1.run(Unknown Source)
at java.lang.Thread.run(Thread.java:736)
Как я понял, сделать это нам не дадут? :(