Документ взят из кэша поисковой машины. Адрес оригинального документа : http://www.fds-net.ru/showflat.php?Number=4639504&src=arc&showlite=
Дата изменения: Unknown
Дата индексирования: Tue Apr 12 10:46:43 2016
Кодировка: Windows-1251
java - про Process - Public forum of MSU united student networks
Root | Google | Yandex | Mail.ru | Kommersant | Afisha | LAN Support
  
Technical >> Development (Archive)

Страницы: 0 | 20 | показать все | след. страница
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
  Re: java - про Process [re: gadfather]
      28.05.2006 15:12
 

Да, исправил.

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
  Re: java - про Process [re: gadfather]
      28.05.2006 15:44
 

Ну и выведется
"Process didn't exit in 5 minutes.", что не так далеко от истины.



'Земля наша велика и обильна, а порядка в ней нет. Приходите княжить и владеть нами'
gadfatherАдминистратор
Carpal Tunnel

Рег.: 05.11.2003
Сообщений: 47302
Из: пл. Гагарина
Рейтинг: 16961
  Re: java - про Process [re: shaller]
      28.05.2006 15:48
 

Может, выведется, а может, и не успеет, если TimerTask.run уже запущено оказалось - timer.cancel его не срубит.



You can't always get what you want
gadfatherАдминистратор
Carpal Tunnel

Рег.: 05.11.2003
Сообщений: 47302
Из: пл. Гагарина
Рейтинг: 16961
  Re: java - про Process [re: gadfather]
      28.05.2006 16:04
 

Я думаю, очевидно корректный метод примерно такой: создается два треда, один ждет процесс, другой ждет таймера.
Который первый дожидается, сигналит основному треду (хз, какие для этого средства в яве - нужен какой-нибудь message queue; можно сигналить через разделяемый объект, тогда дополнительное место для бага, если неосторожно сделать).
Основной тред получает сообщение, срубает оба треда.
Если успевает прийти два сообщения, то учитывать только первое.

Код написать не могу, могу только на C под POSIX попробовать аналог сделать.



You can't always get what you want
shaller
San Jose

Рег.: 25.10.2002
Сообщений: 21640
Из: Станция 074803
Рейтинг: 15646
  Re: java - про Process [re: gadfather]
      28.05.2006 16:05
 


 Ну если не успеет, выведется "Process has exit with code ..." что также можно считать правдой.



'Земля наша велика и обильна, а порядка в ней нет. Приходите княжить и владеть нами'
gadfatherАдминистратор
Carpal Tunnel

Рег.: 05.11.2003
Сообщений: 47302
Из: пл. Гагарина
Рейтинг: 16961
  Re: java - про Process [re: shaller]
      28.05.2006 16:08
 

Не так. Эта строчка может вывестись целиком, или вообще не до конца (атомарность 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
  Re: java - про Process [re: gadfather]
      28.05.2006 16:10
 


 Неа. System.out.println нельзя прервать interrupt'oм. Можно прервать только waitfor.



'Земля наша велика и обильна, а порядка в ней нет. Приходите княжить и владеть нами'
gadfatherАдминистратор
Carpal Tunnel

Рег.: 05.11.2003
Сообщений: 47302
Из: пл. Гагарина
Рейтинг: 16961
  Re: java - про Process [re: shaller]
      28.05.2006 16:15
 

> 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
  Re: java - про Process [re: gadfather]
      28.05.2006 16:18
 

Даже в списке исключений, кидаемых PrintStream.println(String x) нет InterruptedException.



'Земля наша велика и обильна, а порядка в ней нет. Приходите княжить и владеть нами'
Страницы: 0 | 20 | показать все | след. страница

Technical >> Development (Archive)

Дополнительная информация
5 зарегистрированных и 1 анонимных пользователей просматривают этот форум.

Модераторы:  DarkGray 

Печать темы
>>
Права
      Вы можете создавать новые темы
      Вы можете отвечать на сообщения
      HTML отключен
      UBBCode включен

Рейтинг:
Просмотров темы:

Переход в