Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Process.waitFor()时,应用程序停止响应_Java_Processbuilder_Linphone - Fatal编程技术网

Java 使用Process.waitFor()时,应用程序停止响应

Java 使用Process.waitFor()时,应用程序停止响应,java,processbuilder,linphone,Java,Processbuilder,Linphone,我正在从Java应用程序(8u11)中启动一个外部应用程序。但是,在Windows XP和Windows 7下,应用程序对用户界面输入没有响应,并使用标准的计时玻璃/微调器 我已经将这个问题缩小到是否使用Process.waitFor()。如果我叫它,我会看到问题,如果我不叫它,它工作得很好。如果我退出Java应用程序,应用程序也会取消冻结 我的问题是为什么会这样——调用waitFor()如何可能影响子进程的内部运行?我怎样才能避免这个问题呢 正在讨论的应用程序是LinPhone.exe,但我不

我正在从Java应用程序(8u11)中启动一个外部应用程序。但是,在Windows XP和Windows 7下,应用程序对用户界面输入没有响应,并使用标准的计时玻璃/微调器

我已经将这个问题缩小到是否使用Process.waitFor()。如果我叫它,我会看到问题,如果我不叫它,它工作得很好。如果我退出Java应用程序,应用程序也会取消冻结

我的问题是为什么会这样——调用waitFor()如何可能影响子进程的内部运行?我怎样才能避免这个问题呢

正在讨论的应用程序是LinPhone.exe,但我不认为这个问题是特定于该应用程序的-它必须有一些通用的方式来处理标准IO等,我通过调用waitFor()来干扰这些方式

我需要使用Process.waitFor()以便跟踪应用程序何时退出

我已经把这个问题简化为这个问题

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);
    }

}

为了总结讨论,我没有处理标准错误流,导致linphone锁定,因为其标准错误输出缓冲区已满,特别是当linphone产生大量关于标准错误的详细输出时。提供了从Java调用进程所涉及的陷阱的优秀总结

还有一个输入错误,我给非标准的getter打电话

processBuilder.redirectErrorStream();
当我应该叫“塞特”的时候


你是说你正在等待的进程没有响应?请看一看。然后在后台线程中等待。谢谢。我在后台线程上等待,因为它最终是从UI线程触发的,我从SSCCE中删除了这个细节。我会再添加一次,看看是否还能重现这个问题。你在做我链接到的文章中关于流程流的建议吗?如果您不处理它们并且缓冲区内存不足,您可能会中断程序。问题1:您发布的代码会使应用程序长时间处于休眠状态。问题2:你能发布一个我们都可以运行和测试的SSCCE吗?我们大多数人没有linphone.exe。3.您还没有提到如何处理流程的流。
processBuilder.redirectErrorStream(true);