Проблема с Java Threading - PullRequest
       2

Проблема с Java Threading

1 голос
/ 21 февраля 2012

Моя проблема связана с Process и Runtime, и я пытался запустить его, позволяя основному графическому интерфейсу Java Swing обновлять строку состояния, поэтому здесь идет речь:

Последние три месяца я работал над внутренним инструментом разработки для моей группы разработчиков программного обеспечения. Основа заключается в том, что он принимает некоторые переменные, определенные в графическом интерфейсе пользователя, на основе записей пользователя. Затем он компилирует их в командный файл для интерпретации инструментом командной строки. Просто получить графический интерфейс для запуска командной строки после нажатия кнопки «патч» было довольно интересно, но я не смог прочитать какие-либо ошибки, которые могли возникнуть во время выполнения, в немалой степени из-за того, что я использовал «start» в аргументах для runtimeVar.exec (). Мне удалось помочь резиденту Java, но он переключился с разветвления процесса на другой поток на запуск процесса в том же потоке, блокируя GUI от реакции на что-либо еще. Хотя инструмент работает отлично, бета-тестеры жалуются, потому что не знают, работает он или нет.

Короче говоря: мне нужно раскошелиться на runtimeVar.exec () на другой процесс, чтобы разрешить обновление строки состояния, но для этого потребуется серьезная переделка, поскольку именно так сейчас выглядит мой код как:

    private void runPatchTool(File directory, String batchName) throws Exception{
    /*************************************************************************** 
     * Method: runPatchTool
     * Tab: Both
     * Status: Completed, as of 1/10/12
     * 
     * This method will read in a directory and batch file name and output
     * these commands to the command line, running the batch file while reading
     * in the output via the the InputStreamReader and parsing this to check
     * for any errors that may have occurred during the patching.
     * 
     **************************************************************************/
    String tempOFP = null;
    Boolean labType = false;
    String tmpCountry = null;

    int yesNo;
    String s = " ";
    String er = " ";
    String[] query = new String[]{"cmd.exe","/c",directory.getPath() + "\\" + batchName};
//    displayStatus("Running Patch_tool.exe . . . ");    
    ProcessBuilder pb = new ProcessBuilder(query);
    pb.directory(directory);
    try{
        Process proc = pb.start();
        InputStreamReader inStrmRd = new InputStreamReader(proc.getInputStream());
        InputStreamReader erStrmRd = new InputStreamReader(proc.getErrorStream());
        BufferedReader commandResult = new BufferedReader(inStrmRd);
        BufferedReader errResult = new BufferedReader(erStrmRd);
        String line = " ";
        String erLine = " ";
        try {
            while ((line = commandResult.readLine()) != null) {
                s += line + "\n";
            }
            while((erLine = errResult.readLine()) != null){
                er += erLine + "\n";
            }
        } catch (Exception e) {
            JOptionPane.showMessageDialog(this,"Path Tool Error: " + e, "ERROR", JOptionPane.ERROR_MESSAGE);
        }
//        readOutputFiles();
    } catch(IOException e){
        JOptionPane.showMessageDialog(this,"Path Tool Error: " + e, "ERROR", JOptionPane.ERROR_MESSAGE);
    }
    StringBuffer erMsg = new StringBuffer("at least one assembler error has occurred");
    CharSequence erMsgSeq = erMsg;
    try{
        PrintWriter outputFile = new PrintWriter(new FileOutputStream(directory.getPath() + "\\cmdout.txt"));
        outputFile.print(s);
        outputFile.close();
        PrintWriter erFile = new PrintWriter(new FileOutputStream(directory.getPath() + "\\errout.txt"));
        erFile.print(er);
        erFile.close();
    } catch(Exception ex){
        System.out.println("Something happened in PrintWriter: " + ex);
    }
    }

Есть еще код, который я пропустил, но он не относится к конкретной проблеме.

Хорошо, со всем вышесказанным, есть ли способ запустить этот процесс, не блокируя графический интерфейс пользователя и все же ожидая завершения процесса (с помощью обратного вызова или другого метода) перед выполнением следующего шага?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...