2014-09-02 2 views
0

Я запускаю внешнее приложение из своего приложения Java (8u11). Однако приложение не реагирует на ввод пользовательского интерфейса под Windows XP и Windows 7 со стандартным часовым стеклом/счетчиком.Приложение перестает отвечать при использовании Process.waitFor()

Я сузил эту проблему до того, использую ли я Process.waitFor(). Если я это называю, я вижу проблемы, если я не работаю нормально. Кроме того, приложение отключается, если я закрою приложение Java.

Мой вопрос: почему это так - как можно вызывать waitFor(), возможно, повлиять на внутренние действия дочернего процесса? И как я могу избежать этой проблемы?

Это приложение LinPhone.exe, но я не верю, что проблема специфична для приложения - должен быть какой-то общий способ, с помощью которого он обрабатывает стандартный IO и т. Д., Которым я мешаю, позвонив waitFor().

Мне нужно использовать Process.waitFor(), чтобы я мог отслеживать, когда приложение вышло.

Я упростил проблему для этого SCCEE.

import java.io.BufferedReader; 
import java.io.File; 
import java.io.IOException; 
import java.io.InputStreamReader; 

public class LinphoneTest { 

    public static void main(String[] args) throws IOException, 
      InterruptedException { 
     String phoneAppPath = "C:\\Program Files\\Linphone\\bin\\linphone.exe"; 
     ProcessBuilder processBuilder = new ProcessBuilder(phoneAppPath); 
     // move up from bin/linephone.exe 
     File workingDir = new File(phoneAppPath).getParentFile() 
       .getParentFile(); 
     processBuilder.directory(workingDir); 
     processBuilder.redirectErrorStream(); 
     Process process = processBuilder.start(); 
     final BufferedReader stdout = new BufferedReader(
       new InputStreamReader(process.getInputStream())); 
     String line = null; 
     try { 
      while (((line = stdout.readLine()) != null)) { 
       System.out.println(line); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     new Thread(() -> { 
      try { 
       process.waitFor(); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     }, "process wait").start(); 

     Thread.sleep(Long.MAX_VALUE); 
    } 

} 

enter image description here

+0

Вы хотите сказать, что процесс, который вы» ожидание не отвечает? –

+0

Пожалуйста, взгляните на [Когда RunTime.exec() не будет] (http://www.javaworld.com/article/2071275/core-java/when-runtime-exec---won-t.html) , И делайте свое ожидание в фоновом потоке. –

+0

Спасибо. Я выполняю ожидание на фоновом потоке, поскольку он в конечном итоге запускается из потока пользовательского интерфейса, я удалил эту деталь из SSCCE. Я добавлю еще раз и посмотрю, смогу ли я воспроизвести проблему. – Adam

ответ

0

Подводя итог дискуссии, я не обрабатывал стандартные потоки ошибок, вызывающие Linphone зависания в качестве своего выходного буфера для стандартной ошибки наполнились особенно Linphone производит много подробного вывод на стандартной ошибке. When RunTime.exec wont обеспечивает отличное резюме подводных камней, связанных с вызовами процессов с Java.

Был также опечатка, я звоню Нестандартное именем геттер

processBuilder.redirectErrorStream(); 

, когда я должен был называть «сеттер»

processBuilder.redirectErrorStream(true); 

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

  • Нет связанных вопросов^_^