hml
|
journeyman
|
|
|
|
Рег.: 15.09.2005
|
Сообщений: 69
|
|
Рейтинг: 0
|
|
java - про Process
28.05.2006 00:52
|
|
|
у меня есть ворос про Process.
создал один Process так,
Process proc=null; try{ proc = Runtime.getRuntime().exec("c:\\a.exe"); }catch(IOException e){}
вопрос состоит в том, что дописать программу чтобы выполнить следующие требования: 1)если время выполнения Process pro больше 5 минут, то остановить его и destroy 2)иначе время выполнения Process pro меньше 5 минут, надо выводить время выполнения.
спасибо.
|
|
_Ss_
|
|
|
|
|
Рег.: 21.11.2003
|
Сообщений: 4145
|
|
Рейтинг: 4662
|
|
Re: java - про Process
[re: hml]
28.05.2006 01:58
|
|
|
Process proc=null; try{ proc = Runtime.getRuntime().exec("c:\\a.exe"); }catch(IOException e){} Thread.sleep(5000 * 60); try{ int result = proc.exitValue(); // пишем время } catch(IllegalThreadStateException e) { proc.destroy(); // пишем, что плохо }
Как-то так... В любом случае, почитай http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Process.ht... - про exitValue() особенно.
Редактировал _Ss_ (28.05.2006 02:51)
|
Если сказанное мной может быть понято двояко, и первый вариант тебя расстраивает, я имел ввиду второй |
|
hml
|
journeyman
|
|
|
|
Рег.: 15.09.2005
|
Сообщений: 69
|
|
Рейтинг: 0
|
|
Re: java - про Process
[re: _Ss_]
28.05.2006 03:29
|
|
|
code:
you wrote Process proc=null; try{ proc = Runtime.getRuntime().exec("c:\\a.exe"); }catch(IOException e){} Thread.sleep(5000 * 60); try{ int result = proc.exitValue(); // пишем время } catch(IllegalThreadStateException e) { proc.destroy(); // пишем, что плохо }
Как-то так... В любом случае, почитай http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Process.ht... - про exitValue() особенно.
Так не правильно . Втаком случае текущий нить(current Thread) всегда ждет 5 минут. Если время выполнения pro только 2 секунды, тогда программа выводит 5 минут ???? (не правильно)
Редактировал DarkGray (28.05.2006 12:56)
|
|
hml
|
journeyman
|
|
|
|
Рег.: 15.09.2005
|
Сообщений: 69
|
|
Рейтинг: 0
|
|
Re: java - про Process
[re: hml]
28.05.2006 03:32
|
|
|
подумаю, что надо использовать method wait(. ), но не знаю как правильно
|
|
_Ss_
|
|
|
|
|
Рег.: 21.11.2003
|
Сообщений: 4145
|
|
Рейтинг: 4662
|
|
Re: java - про Process
[re: hml]
28.05.2006 12:55
|
|
|
Можно
boolean badExit = True; while(не_прошло_5_мин){ try{ int result = proc.exitValue(); // пишем время badExit = False; break; } catch(IllegalThreadStateException e) {} } if(badExit){ proc.destroy(); // нишем, что все плохо }
|
Если сказанное мной может быть понято двояко, и первый вариант тебя расстраивает, я имел ввиду второй |
|
_Ss_
|
|
|
|
|
Рег.: 21.11.2003
|
Сообщений: 4145
|
|
Рейтинг: 4662
|
|
Re: java - про Process
[re: _Ss_]
28.05.2006 13:52
|
|
|
Проверил. Вот это работает:
code:
import java.io.IOException;
public class Proc { public static void main(String[] args) throws InterruptedException { Process proc=null; try{ proc = Runtime.getRuntime().exec("notepad"); }catch(IOException e){} boolean badExit = true; long maxTime = 1000000000;// 1 секунда maxTime *= 300; // 5 минут long startTime = System.nanoTime(); long curTime = System.nanoTime(); while(curTime - startTime < maxTime){ try{ int result = proc.exitValue(); System.err.println("Время " + (curTime - startTime) / 1000000 + " мсек"); badExit = false; break; } catch(IllegalThreadStateException e) {} curTime = System.nanoTime(); } if(badExit){ proc.destroy(); System.err.println("Все плохо"); } } }
|
Если сказанное мной может быть понято двояко, и первый вариант тебя расстраивает, я имел ввиду второй |
|
hml
|
journeyman
|
|
|
|
Рег.: 15.09.2005
|
Сообщений: 69
|
|
Рейтинг: 0
|
|
Re: java - про Process
[re: _Ss_]
28.05.2006 14:07
|
|
|
|
Mike
|
Ызарг
|
|
|
|
Рег.: 02.11.2002
|
Сообщений: 8098
|
|
Рейтинг: 2147
|
|
Re: java - про Process
[re: _Ss_]
28.05.2006 14:20
|
|
|
Зачем цикл?
code: public class ProcessTest { public static void main(String args[]) { try { Timer timer = new Timer(true); final Thread mainThread = Thread.currentThread(); long timeBegin = System.currentTimeMillis(); final Process process = Runtime.getRuntime().exec("calc.exe"); timer.schedule(new TimerTask() { public void run() { mainThread.interrupt(); process.destroy(); } }, 5*60*1000); int result = process.waitFor(); timer.cancel(); mainThread.interrupted(); System.out.println("Process has exit with code " + result + " after " + (System.currentTimeMillis() - timeBegin) + " milliseconds."); } catch (InterruptedException e) { System.out.println("Process didn't exit in 5 minutes."); } catch (Exception e) { System.out.println("Error."); } } }
Редактировал Mike (29.05.2006 17:32)
|
|
gadfather
|
Carpal Tunnel
|
|
|
|
Рег.: 05.11.2003
|
Сообщений: 47302
|
Из: пл. Гагарина
|
Рейтинг: 16961
|
|
Re: java - про Process
[re: Mike]
28.05.2006 14:45
|
|
|
Если процесс завершится сам чуть-чуть раньше таймера, то mainThread сможет начать уже что-то печатать про время, а тут таймер его прибьет. Race condition, однако.
|
You can't always get what you want |
|
Mike
|
Ызарг
|
|
|
|
Рег.: 02.11.2002
|
Сообщений: 8098
|
|
Рейтинг: 2147
|
|
|
|
gadfather
|
Carpal Tunnel
|
|
|
|
Рег.: 05.11.2003
|
Сообщений: 47302
|
Из: пл. Гагарина
|
Рейтинг: 16961
|
|
Re: java - про Process
[re: Mike]
28.05.2006 15:16
|
|
|
Ниче не исправил. Например, waitfor уже сработал, а timer.cancel еще нет, и тут оно как жахнет...
|
You can't always get what you want |
|
shaller
|
San Jose
|
|
|
|
Рег.: 25.10.2002
|
Сообщений: 21640
|
Из: Станция 074803
|
Рейтинг: 15646
|
|
|
Ну и выведется "Process didn't exit in 5 minutes.", что не так далеко от истины.
|
'Земля наша велика и обильна, а порядка в ней нет. Приходите княжить и владеть нами' |
|
gadfather
|
Carpal Tunnel
|
|
|
|
Рег.: 05.11.2003
|
Сообщений: 47302
|
Из: пл. Гагарина
|
Рейтинг: 16961
|
|
|
Может, выведется, а может, и не успеет, если TimerTask.run уже запущено оказалось - timer.cancel его не срубит.
|
You can't always get what you want |
|
gadfather
|
Carpal Tunnel
|
|
|
|
Рег.: 05.11.2003
|
Сообщений: 47302
|
Из: пл. Гагарина
|
Рейтинг: 16961
|
|
|
Я думаю, очевидно корректный метод примерно такой: создается два треда, один ждет процесс, другой ждет таймера. Который первый дожидается, сигналит основному треду (хз, какие для этого средства в яве - нужен какой-нибудь message queue; можно сигналить через разделяемый объект, тогда дополнительное место для бага, если неосторожно сделать). Основной тред получает сообщение, срубает оба треда. Если успевает прийти два сообщения, то учитывать только первое.
Код написать не могу, могу только на C под POSIX попробовать аналог сделать.
|
You can't always get what you want |
|
shaller
|
San Jose
|
|
|
|
Рег.: 25.10.2002
|
Сообщений: 21640
|
Из: Станция 074803
|
Рейтинг: 15646
|
|
|
Ну если не успеет, выведется "Process has exit with code ..." что также можно считать правдой.
|
'Земля наша велика и обильна, а порядка в ней нет. Приходите княжить и владеть нами' |
|
gadfather
|
Carpal Tunnel
|
|
|
|
Рег.: 05.11.2003
|
Сообщений: 47302
|
Из: пл. Гагарина
|
Рейтинг: 16961
|
|
|
Не так. Эта строчка может вывестись целиком, или вообще не до конца (атомарность System.out.println кто-нибудь обещает?). А потом выведется "Process didn't exit in 5 minutes."
|
You can't always get what you want |
|
shaller
|
San Jose
|
|
|
|
Рег.: 25.10.2002
|
Сообщений: 21640
|
Из: Станция 074803
|
Рейтинг: 15646
|
|
|
Неа. System.out.println нельзя прервать interrupt'oм. Можно прервать только waitfor.
|
'Земля наша велика и обильна, а порядка в ней нет. Приходите княжить и владеть нами' |
|
gadfather
|
Carpal Tunnel
|
|
|
|
Рег.: 05.11.2003
|
Сообщений: 47302
|
Из: пл. Гагарина
|
Рейтинг: 16961
|
|
|
> System.out.println нельзя прервать interrupt'oм.
А вдруг там внутри I/O через InterruptibleChannel?
Ну а если не прервет, к чему тогда приведет interrupt flag - тут моих знаний не хватает?
|
You can't always get what you want |
|
hml
|
journeyman
|
|
|
|
Рег.: 15.09.2005
|
Сообщений: 69
|
|
Рейтинг: 0
|
|
Re: java - про Process
[re: Mike]
28.05.2006 16:17
|
|
|
да, красивое решение. есть другое без Timer ?
|
|
shaller
|
San Jose
|
|
|
|
Рег.: 25.10.2002
|
Сообщений: 21640
|
Из: Станция 074803
|
Рейтинг: 15646
|
|
|
Даже в списке исключений, кидаемых PrintStream.println(String x) нет InterruptedException.
|
'Земля наша велика и обильна, а порядка в ней нет. Приходите княжить и владеть нами' |
|