Google Groups no longer supports new usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Proces ID

0 views
Skip to the first unread message

Agata

unread,
18 Aug 2005, 04:07:3718/08/2005
to
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.

Pozdrawiam
Agata

--
Wysłano z serwisu OnetNiusy: http://niusy.onet.pl

a1

unread,
19 Aug 2005, 06:54:4919/08/2005
to
Agata <agadWY...@seznam.cz> napisał(a):

> 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/

Agata

unread,
9 Sept 2005, 07:02:4809/09/2005
to
>Dziekuje bardzo za odpowiedz. Klase musialam troszke zmodyfikowac, bo
potrzebuje wyjscie z procesu:

public class Runner extends Thread{

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"?

a1

unread,
9 Sept 2005, 07:18:1509/09/2005
to
Agata wrote:

> 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

ag...@seznam.cz

unread,
9 Sept 2005, 07:57:2309/09/2005
to
>
> 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].
>
masz racje :(

>
> Rozwiazanie jest dosyc proste, trzeba dolozyc odpowiednio
> zsynchronizowana metode do startowania processu np:
>
> synchronized public execute() {
>   start();
>   try {
>     wait();
>   }
>   catch (InterruptedException ex) {
>   }
> }
>
pytanie jest pewnie glupie, ale gdzie mam dolozyc te metode? Dodalam ja do
klasy Runner (jeszcze musialam dodac void).

> 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 :(

a1

unread,
9 Sept 2005, 08:14:5709/09/2005
to
ag...@seznam.cz wrote:

> Potem to staruje:
> Runner p=new Runner(..);
> p.start();

startuj p.execute()

--

a1

ag...@seznam.cz

unread,
9 Sept 2005, 08:16:0309/09/2005
to
Dziekuje, juz dziala :)

A.

0 new messages