Pozdrawiam
Agata
--
Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
> Czy Jak uruchomie proces przez Runtime.getRuntime().exec("....") w Windowsach
> to moge jakos potem uzyskac ID tego procesu? W pewnych przypadkach potrzebuje
> go zabic, ale niestety metoda destroy() nie dziala jesli uruchamiam ja z innej
> metody, dlatego chcialabym go zabic przez pskill, ale do tego musze znac ID.
Hmm ogolnie to sie wystrzegam exec jak ognia, ale jak juz musze:
public class Runner extends Thread {
private String cmd = null;
private Process process = null;
public Runner(cmd) {
super("Runner - " + cmd);
this.cmd = cmd;
}
public void run() {
try {
process = Runtime.getRuntime().exec(cmd);
process.waitFor();
}
catch (Throwable ex) {
ex.printStackTrace();
}
}
public void killProcess() {
process.destroy();
}
}
a potem w kodzie:
Runner r = new Runner(cmd);
r.start();
..
r.killProcess();
Nie zauwazylem nigdy problemu z kilkowaniem processu w takim wypadku
a1
--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
private String cmd = null;
private Process process = null;
public Runner(String cmd) {
super("Runner - " + cmd);
this.cmd=cmd;
}
public void run() {
try
{
process = Runtime.getRuntime().exec(cmd);
process.waitFor();
} catch (Throwable ex) {
ex.printStackTrace();
}
}
public void killProcess() {
process.destroy();
}
public InputStream getInputStream(){
return process.getInputStream();
}
public InputStream getErrorStream(){
return process.getErrorStream();
}
}
Nie wiem jeszcze jak jest z zabijaniem procesu, ale mam problem juz z
uruchomieniem. Tzn., kiedy puszczam aplikacje z debbugera, to wszystko dziala
dobrze, natomiast jesli ja uruchomie przez run, to dostaje wyjatek:
java.lang.NullPointerException
at Runner.getInputStream(Runner.java:41)
at CfmccDownPanel$1$GoListener.Generuj(CfmccDownPanel.java:128)
at CfmccDownPanel$1$GoListener.access$0(CfmccDownPanel.java:69)
at CfmccDownPanel$1.run(CfmccDownPanel.java:199)
at java.lang.Thread.run(Thread.java:479)
tak jakby ten InputStream byl jeszcze niedostepny.
Czy mozna to jakos "obejsc"?
> Nie wiem jeszcze jak jest z zabijaniem procesu, ale mam problem juz z
> uruchomieniem. Tzn., kiedy puszczam aplikacje z debbugera, to wszystko dziala
> dobrze, natomiast jesli ja uruchomie przez run, to dostaje wyjatek:
> java.lang.NullPointerException
> at Runner.getInputStream(Runner.java:41)
> at CfmccDownPanel$1$GoListener.Generuj(CfmccDownPanel.java:128)
> at CfmccDownPanel$1$GoListener.access$0(CfmccDownPanel.java:69)
> at CfmccDownPanel$1.run(CfmccDownPanel.java:199)
> at java.lang.Thread.run(Thread.java:479)
> tak jakby ten InputStream byl jeszcze niedostepny.
> Czy mozna to jakos "obejsc"?
> Agata
Problem z synchronizacja... robisz jak sadze cos takiego:
Runner runner = new Runnr(cmd);
runner.start();
runner.getInputStream(); // <- nie masz pewnosci czy thread juz zdarzyl
wystartowac i zinstancjonowac process [mogl jeszcze nie dostac czasu
procesora itp].
Rozwiazanie jest dosyc proste, trzeba dolozyc odpowiednio
zsynchronizowana metode do startowania processu np:
synchronized public execute() {
start();
try {
wait();
}
catch (InterruptedException ex) {
}
}
oraz zmodyfikowac nieco runa
public run() {
try
{
synchronized (this) {
process = Runtmie.getRuntime(exec);
notify();
}
process.waitFor();
}
catch (Throwable ex) {
ex.printStackTrace();
}
}
--
a1
> oraz zmodyfikowac nieco runa
>
> public run() {
> try
> {
> synchronized (this) {
> process = Runtmie.getRuntime(exec);
> notify();
> }
> process.waitFor();
> }
> catch (Throwable ex) {
> ex.printStackTrace();
> }
> }
>
> --
Potem to staruje:
Runner p=new Runner(..);
p.start();
ale dostaje:
java.lang.IllegalMonitorStateException: current thread not owner
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:415)
at CfmccDownPanel$1$GoListener.Generuj(CfmccDownPanel.java:127)
at CfmccDownPanel$1$GoListener.access$0(CfmccDownPanel.java:69)
at CfmccDownPanel$1.run(CfmccDownPanel.java:201)
at java.lang.Thread.run(Thread.java:479)
Jak dam p.execute(), to jest to samo :(
> Potem to staruje:
> Runner p=new Runner(..);
> p.start();
startuj p.execute()
--
a1
A.