проблема уничтожения процесса в приложении Java - PullRequest
1 голос
/ 10 сентября 2011

Я создал приложение Java, в котором основной метод (запуск программы) инициирует объект Process и объект класса MainWindow, который создает JFrame.

public static void main(String[] args) throws Exception {

File file = new File("./access/run.bat"); 
ProcessBuilder process_builder = new ProcessBuilder("cmd", "/c", file.getName());
process_builder.directory(file.getParentFile());
Process process = process_builder.start();
MainWindow window = new MainWindow(process);

}

Я хотел бы прекратить (kill)) процесс, который был создан с помощью process.destroy () , когда окно было закрыто.Вот некоторый код класса MainWindow:

public MainWindow(final Process process) throws TransformerException, ParserConfigurationException, Exception{  

JFrame mainWindowFrame = new JFrame();

*****some code here*****        

mainWindowFrame.addWindowListener(new WindowListener() {

public void windowClosed(WindowEvent arg0) {

    process.destroy();
    System.exit(0);
    }

*****some code here*****    
  }

}

Когда окно закрыто, к сожалению, процесс не завершен ... Кто-нибудь может дать мне объяснение этого и возможного решения?Спасибо !!!

Ответы [ 2 ]

1 голос
/ 10 сентября 2011

Согласно документации здесь тогда windowClosed вызывается только в том случае, если окно расположено.Для этого вы можете либо вызвать dispose в окне, либо установить операцию закрытия по умолчанию: в своем коде после создания JFrame добавьте следующее:

mainWindowFrame.setDefaultCloseOperation(javax.swing.JFrame.DISPOSE_ON_CLOSE);

После просмотра вашего кода я предлагаю вамработать по-другому: в своем слушателе вы разрушаете процесс и затем выходите.следовательно, вы можете настроить операцию закрытия глухих на выход и затем реализовать процесс уничтожения в реализации
метода windowClosing : изменение кода MainWindow следующим образом:

public MainWindow(final Process process) throws TransformerException, ParserConfigurationException, Exception{  

JFrame mainWindowFrame = new JFrame();
mainWindowFrame.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);

*****some code here*****        

mainWindowFrame.addWindowListener(new WindowListener() {

public void windowClosing(WindowEvent arg0) {

    process.destroy();

    }

*****some code here*****    
  }

}
0 голосов
/ 10 сентября 2011

Javadoc класса Process говорит так:

 The subprocess is not killed when there are no more references 
 to the Process object, but rather the subprocess 
 continues executing asynchronously.

There is no requirement that a process represented 
by a Process object execute asynchronously or concurrently 
with respect to the Java process that owns the Process object.

После поиска в Интернете кажется, что проблема на платформе Java начиная с Java 1.3. Я нашел эту запись в блоге , которая объясняет многие проблемы Process в Java.

Проблема в том, что process становится сиротой после уничтожения приложения. В своем коде вы убиваете Process из GUI, поскольку GUI (класс MainWindow) имеет свой собственный поток, и он не является Process родительским. Это проблема родителей / детей. Есть два способа исправить это:

  1. Поскольку основной поток является родительским процессом, основной поток должен вызывать метод destroy. Таким образом, вы должны сохранить ссылку на объект process.

  2. Второй способ - создать процесс при запуске MainWindow. В аргументе класса MainWindow вы можете передать аргументы процесса. Поэтому, когда вызывается метод windowClosed, если MainWindow закрывается, Process будет уничтожен, так как последний является потомком MainWindow.

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