1

Я запускаю команду через runtime.exec, которая занимает некоторое время. Я хочу обновить мой ProgressBar.
Я уже получил желаемый системный выход, проблема в том, что я получаю все сразу, когда процесс завершен. И не шаг за шагом, чтобы обновить ProgressBar ...получить сразу системный выход во время выполнения (обновление ProgressBar) Java

Вот код

public Runtime rt = Runtime.getRuntime(); 
public Process pp; 

    public doit() { 
     try { 
      pp = rt.exec(a_long_timed_process); 
      InputStream is = pp.getErrorStream(); 
      InputStreamReader isr = new InputStreamReader(is); 
      BufferedReader br = new BufferedReader(isr); 
      String line = null; 
      while ((line = br.readLine()) != null) { 
       if (line.contains("In:")) { 
        int a = line.indexOf("In:");    //get a string 
        int b = line.lastIndexOf("%");   //between 
        String lineout = line.substring(a + 3, b);//"0.00" and "99.99" 
        double nr = Double.parseDouble(lineout); //make it a double 
        int round = (int) nr;      //make it a usable int 
        System.out.println(round); 
        myProgressBar.setValue(round);   //UPDATE Progressbar 
       } 
      } 
      pp.waitFor(); 
     } catch (IOException ex) { 
      Logger.getLogger(Sox.class.getName()).log(Level.SEVERE, null, ex); 
     } catch (InterruptedException ex) { 
      Logger.getLogger(Sox.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

каждую помощь оценена
Спасибо заранее

+1

Не блокируйте EDT (Thread Dispatch Thread) - графический интерфейс «замерзнет», когда это произойдет. Вместо вызова 'Thread.sleep (n)' реализовать Swing 'Timer' для повторения задач или' SwingWorker' для длительных задач. Подробнее см. [Параллелизм в Swing] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/). –

ответ

3

Вы должны запустите процесс в другом потоке, если вы хотите иметь возможность обрабатывать его вывод одновременно. Хороший способ сделать это - использовать ProcessBuilder.

Из документации:

Этот класс используется для создания процессов операционной системы.

[...]

Начиная новый процесс, который использует рабочий каталог и среды по умолчанию легко:

Process p = new ProcessBuilder("myCommand", "myArg").start(); 

Вот пример, который запускает процесс с изменен рабочий каталог и перенаправляет стандартный вывод и ошибку на в файл журнала:

ProcessBuilder pb = 
    new ProcessBuilder("myCommand", "myArg1", "myArg2"); 
Map<String, String> env = pb.environment(); 
env.put("VAR1", "myValue"); 
env.remove("OTHERVAR"); 
env.put("VAR2", env.get("VAR1") + "suffix"); 
pb.directory(new File("myDir")); 
File log = new File("log"); 
pb.redirectErrorStream(true); 
pb.redirectOutput(Redirect.appendTo(log)); 
Process p = pb.start(); 
assert pb.redirectInput() == Redirect.PIPE; 
assert pb.redirectOutput().file() == log; 
assert p.getInputStream().read() == -1; 

См. Также here еще один пример кода, который вы можете адаптировать к вашим потребностям.

1

Вы видите эффект буферизации вывода в запущенном процессе. Вы ничего не можете сделать в коде Java.