Я пытаюсь сделать интерфейс, откуда мы можем при нажатии кнопки выполнить EXE-файлы для установки в качестве / W - PullRequest
0 голосов
/ 09 октября 2018

Это мой основной класс, в котором run (), я вызываю другой метод install setup (), который предназначен для exe-файлов.

 public static void main(String[] args) {
    launch(args);
   }  
public void startSetup() {
Runnable task=new Runnable() {
        @Override
        public void run() {
            try {
                Thread.sleep(1000);
                installSetup();
            } catch (InterruptedException e) {
            e.printStackTrace();
            }

        }


    }; 

Thread thread=new  Thread(task);
thread.start();
}

Вот мой метод installsetup ()

  public void installSetup() {
    try {
        Runtime.getRuntime().exec("cmd /c C:path\\setup.exe", null, new File("C:pathfolder\\01_Setupexe"));
        //process.waitFor();
    } catch (IOException e) {
        e.printStackTrace();
    }   
};

Я вызываю его в своем классе контроллера следующим образом:

public class Controller extends Thread {
  @FXML
    private ComboBox<?> dsetup;
  public void generateRandom() {
     if(dsetup.getValue()!=null) dsetupValue = dsetup.getValue().toString();
     if(dsetupValue!=null)call.startSetup();

Прежде чем я просто вызывал установочные файлы с помощью метода exec, но не с концепцией потоков, приложение работало нормально, ноон выполнял все файлы ..exe одновременно, и мой интерфейс зависал.Поэтому сейчас я использую концепцию потоков и пытаюсь реализовать один поток за раз.Я не понимаю, если это неправильный путь или нет, но я не получаю никакой ошибки в консоли.

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

Runtime.exec устарел на протяжении многих лет.Вместо этого используйте ProcessBuilder :

ProcessBuilder builder = new ProcessBuilder("C:\\path\\setup.exe");
builder.directory(new File("C:pathfolder\\01_Setupexe"));
builder.inheritIO();
builder.start();

Метод inheritIO () заставит порожденный процесс использовать программы Java stdin, stdout и stderr, поэтому он не будет зависать в ожидании ввода или ожиданиядля доступного выходного буфера.

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

0 голосов
/ 09 октября 2018

К сожалению, у exec есть некоторые подводные камни.Большую часть времени использование процесса aproche (см. Листинг 4.3) спасло меня от проблем с буфером и так далее.https://www.javaworld.com/article/2071275/core-java/when-runtime-exec---won-t.html

import java.util.*;
import java.io.*;
public class MediocreExecJavac
{
    public static void main(String args[])
    {
        try
        {            
            Runtime rt = Runtime.getRuntime();
            Process proc = rt.exec("javac");
            InputStream stderr = proc.getErrorStream();
            InputStreamReader isr = new InputStreamReader(stderr);
            BufferedReader br = new BufferedReader(isr);
            String line = null;
            System.out.println("<ERROR>");
            while ( (line = br.readLine()) != null)
                System.out.println(line);
            System.out.println("</ERROR>");
            int exitVal = proc.waitFor();
            System.out.println("Process exitValue: " + exitVal);
        } catch (Throwable t)
          {
            t.printStackTrace();
          }
    }
}

Источник: javaworld

...