Попытка запустить exe-файл, созданный из файла cpp в Java - PullRequest
0 голосов
/ 29 апреля 2018

Я пытаюсь запустить исполняемый файл, созданный из программы cpp в Java. Если я дважды щелкну exe-файл, он будет работать нормально, но если я запустю этот файл с помощью ProcessBuilder, он по какой-то причине зависнет, напечатает большую часть ожидаемого результата и не продолжит работу, также делая всю Java-программу не отвечать на запросы. вот мой код:

    String filePath = FirstScreenController.getFile().getPath();
    ProcessBuilder launcher = new ProcessBuilder("ClusteringProgram\\Release\\main.exe",filePath);
    launcher.redirectErrorStream(true);
    try {
        /*File file = FirstScreenController.getFile();
        Path newPath = Paths.get(System.getProperty("user.dir")+"\\ClusteringProgram").resolve("K12.fasta");//Moving the file to the 
        Files.copy(Paths.get(file.getPath()), newPath, StandardCopyOption.REPLACE_EXISTING);*/
        System.out.println("Execution started");
        p = launcher.start();
        InputStream stderr = p.getInputStream();
        InputStreamReader isr = new InputStreamReader(stderr);
        BufferedReader br = new BufferedReader(isr);
        String line = null;
        while ((line = br.readLine()) != null) {
            System.out.println(line);

        }
        p.waitFor();//Waiting for the process to finish running
        System.out.println("Execution completed");  
    } catch (IOException | InterruptedException  e) {e.printStackTrace();}

1 Ответ

0 голосов
/ 29 апреля 2018

Закройте ваш поток. Вот что заставляет тебя висеть. Я пишу такой код совсем немного.

    while ((line = br.readLine()) != null) {
        System.out.println(line);

    }
    br.close(); // You need this or p can hang
    p.waitFor();

Кроме того, вы позвонили launcher.redirectStandardError(true);, так что вам действительно нужно все это, чтобы собрать вместе stdout и stderr: Весь остальной ответ неверен. Я не знаю, что вызывает тупик. Я оставляю здесь большой фрагмент кода на случай, если это какая-то странная ошибка библиотеки, и оказывается, что для ее обхода требуется метод двухпоточного чтения.

    final object lock = new object();
    InputStream stdout = p.getInputStream();
    InputStreamReader isr = new InputStreamReader(stdout);
    BufferedReader br = new BufferedReader(isr);
    final InputStream stderr = p.getErrorStream();
    one = new Thread() {
        public void run() {
               InputStreamReader isr2 = new InputStreamReader(stderr);
               BufferedReader br2 = new BufferedReader(isr2);
               while ((line2 = br2.readLine()) != null) {
                   synchronized(lock) {
                      System.out.println(line2);
                   }
               }
               br2.close(); // you need this or p can hang
        }  
    };
    one.start();
    while ((line = br.readLine()) != null) {
        synchronized(lock) {
            System.out.println(line);
        }
    }
    br.close(); // You need this or p can hang
    for (;;) {
        try {
            one.join();
            break;
        } catch (InterruptedException v) {
            /* if there's something that might want the main thread's attention handle it here */
        }
    }
    p.waitFor();
...