我正在尝试通过单击按钮执行.exe文件从那里创建一个界面,以安装软件

时间:2018-10-09 14:26:10

标签: java multithreading javafx exe

这是我的主类,其中run(),我正在调用另一种用于exe文件的方法install setup()。

 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 :(得分:3)

Runtime.exec已经过时很多年了。请改用ProcessBuilder

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

inherentIO()方法将使生成的进程使用Java程序的stdin,stdout和stderr,因此它不会挂起等待输入或等待可用的输出缓冲区。

我怀疑您是否需要新的线程或sleep调用,但是我不知道您正在调用哪些文件,或者它们是否相互依赖。

答案 1 :(得分:0)

可悲的是,执行人员有一些陷阱。大多数情况下,使用过程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