Запустите выполнение .exe из моих инструментов Java - PullRequest
0 голосов
/ 29 октября 2011

У меня есть инструменты с пользовательскими интерфейсами на Java.Если я нажимаю на кнопку, я хочу запустить приложение.exe в моих инструментах, у меня есть консоль, куда я хочу вывести вывод (консоль) .exe.Для этого я сделал так:

Runtime run = Runtime.getRuntime();
    StyledDocument doc = txtResult.getStyledDocument();
    SimpleAttributeSet keyWord = new SimpleAttributeSet();
    StyleConstants.setForeground(keyWord, Color.RED);

try {

    Process pp=run.exec(PATHEXE);

    BufferedReader in =new BufferedReader(new InputStreamReader(pp.getInputStream()));
    BufferedReader inErr =new BufferedReader(new InputStreamReader(pp.getErrorStream()));
    String line = null;
    String lineErr = null;
    while (((line = in.readLine()) != null) ||(lineErr = inErr.readLine()) != null) {
        if(line != null)
             doc.insertString(doc.getLength(), line+"\n", null );
        if(lineErr != null)
              doc.insertString(doc.getLength(), lineErr+"\n", keyWord );
    }

    int exitVal = pp.waitFor();
    System.out.println("Process exitValue: " + exitVal);
    btRun.setEnabled(true);
}   catch (Exception e) {
    e.printStackTrace();
    System.out.println(e.getMessage());
}

Все работает, но у меня все еще есть некоторые проблемы:

  1. Я хотел бы перенести выполнение.exe в другом потоке, чтобы освободить интерфейс пользователя во время выполнения .exe.
  2. Чтение выходного .exe в моем инструменте только в конце ... затем запустите обновление, которое я получаю привремя?

Ответы [ 3 ]

1 голос
/ 29 октября 2011

Используйте SwingWorker. Он предоставляет возможность удалить долго выполняющуюся задачу из EDT, одновременно обновляя GUI в EDT.

0 голосов
/ 29 октября 2011

Если вы не хотите, чтобы ваш пользовательский интерфейс блокировался во время выполнения .exe, просто запустите run.exec в дочернем потоке. Более того, вы можете зарегистрировать функцию обратного вызова в дочернем потоке, которую она может вызвать в конце выполнения.

0 голосов
/ 29 октября 2011

Выполнить то, что у вас есть в потоке, легко:

// put up a progress dialog or something here

Runnable backgroundJob = new Runnable() {
    public void run() {
        final String output = executeJob();  // call your code you provided
        SwingUtilities.invokeLater( new Runnable() {
            public void run() {
                // safely do your updates to the UI here on the Swing Thread
                // hide progress dialog here
                updateUI( output );
            }
        });
    }
};
Thread backgroundThread = new Thread( backgroundJob );
backgroundThread.start();
...