2016-05-13 2 views
1

У меня есть gui в java, и я хочу запустить внутри своего графического интерфейса, когда нажимается одна исполняемая программа. Мой код для запуска исполняемого файла заключается в следующем:Замораживание окна при использовании многопоточности в java

Process pr; 
Runtime rt = Runtime.getRuntime(); 
new Thread(() -> { 
try { 
    Process proc = rt.exec("Release\\face.exe", null, new File("Release\\")); 
    } catch (Exception e1) { 
    e1.printStackTrace(); 
    } 
}).start(); 

Исполняемыми работают, когда я нажав на кнопку, однако я обнаружить замораживание в исполняемом поведении. Я попытался добавить многопоточность, чтобы проверить, является ли это причиной замораживания, однако все же я испытываю то же самое. Что здесь может быть не так?

EDIT: Я попытался добавить следующие строки для InputStreamReader в моей теме:

new Thread(() -> { 
try { 
    Runtime rt = Runtime.getRuntime(); 
    Process proc = rt.exec("face.exe", null, new File("Release\\")); 
    BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream())); 
    BufferedReader err = new BufferedReader(new InputStreamReader(proc.getErrorStream())); 
     } catch (Exception e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } 
    }).start(); 

Я получил сообщение InputStreamReader не может быть разрешен к типу.

+0

Возможно, недостаточно кода для ответа ... но вы, вероятно, блокируете EDT. –

+0

Как проверить, заблокирован ли я EDT? Я не очень хорошо знаком с EDT. –

+0

Дайте нам код вашего обработчика событий, по крайней мере ... –

ответ

1

Как упоминалось выше, ваш исполняемый файл, вероятно, блокируется, потому что выход не обрабатывается и «застревает» через некоторое время, поскольку исполняемый файл не может записать больше своего стандартного выхода (вероятно, консоль).

Я обычно используют код вроде следующего запуска внешних команд из Java:

Process p = Runtime.getRuntime().exec(args); 
BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream())); 
BufferedReader err = new BufferedReader(new InputStreamReader(p.getErrorStream())); 

StreamHandler outputHandler = new StreamHandler(in); 
outputHandler.start(); 

StreamHandler errorHandler = new StreamHandler(err); 
errorHandler.start(); 

, где StreamHandler определяется следующим образом:

class StreamHandler extends Thread { 
     private final BufferedReader in; 
     private final JTextArea[] textArea; 

     public StreamHandler(final BufferedReader in) { 
      this.in = in; 
     } 

     @Override 
     public void run() { 
      try { 
       String line = null; 
       while ((line = this.in.readLine()) != null) { 
        System.out.println(line); 
       } 
      } catch (IOException e) { 
       log.info("StreamHandler got interrupted"); 
       e.printStackTrace(); 
      } 
     } 
    } 

Естественно, обработчик потока может быть более сложным, например, писать ошибки в System.err вместо System.out или писать в JTextArea или где-то еще.

1

Поскольку вы не читаете InputStreams для этого объекта процесса, возможно, что он застревает, потому что буфер потока заполнен, в результате чего exe блокируется при записи в stdout.

+0

Ничего себе, это было. Внутри исполняемого файла я писал вещи в файле, когда я прокомментировал эту строку, исполняемый файл отлично работал. Однако для меня это важно, чтобы написать все, что нужно сделать, как я могу преодолеть это бремя? –

+0

Ну, теперь бремя лежит на вашем Java-коде, чтобы что-то сделать с выходом. Вы можете записать его в стандартный файл Java-программы или в файл. – bowmore

+0

На самом деле исполняемый файл открывает камеру и отслеживает некоторые точки с лица, а затем сохраняет их в реальном времени в файле, как можно анализировать эти точки от исполняемого файла до java? –

Смежные вопросы