Вызываете калькулятор Windows10 для процесса Java? - PullRequest
0 голосов
/ 20 сентября 2018

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

В качестве одного из моих первых упражнений мне сказали создать процесс, который выполняет калькулятор Windows, затем подождите, покаПроцесс завершен, затем отправьте сообщение.Это фрагмент кода, который я сделал.

Process p = Runtime.getRuntime().exec("calc.exe");
p.waitFor();
System.out.println("Process finished");

Когда я его выполняю, открывается калькулятор Windows 10, а затем я получаю сообщение «Процесс завершен» .Я не знал, почему получил сообщение, когда процесс еще работал, поскольку калькулятор был открыт, поэтому я попытался запустить точно такой же код, но с "notepad.exe" в качестве команды дляexecute.

На этот раз результат выполнения был ожидаемым: я не получил сообщение, пока не закрыл блокнот.

Я пытался открыть другие программы Windows 10 по умолчанию, например "explorer.exe" , и некоторые из них работали так, как это должно работать, а другие - нет.

Мои мысли о том, как это работает, заключается в том, что "explorer.exe" или "calc.exe" работают как своего рода средство запускапоэтому, когда они получают процесс, выполняющий их, они создают свои собственные процессы, которые я не контролирую с помощью Java-программы.Это полное предположение , сделанное мной.

актуальный вопрос : Почему это происходит?Как калькулятор Windows 10 и другие программы работают с точки зрения процессов?

Заранее спасибо.

1 Ответ

0 голосов
/ 20 сентября 2018

Process#waitFor() возвращает значение int, которое фактически является кодом выхода (т. Е. errorlevel) процесса.

Ваш код завершается ошибкой в ​​тех случаях, когда запущенный процесс возвращает ненулевое значение errorlevel иработает "правильно" (то есть, как и ожидалось) в противном случае.Вы можете проверить это, запустив пакетный файл ниже:

@echo off
calc.exe
REM explorer.exe
echo Error level: %errorlevel%

Он вернет в вашей среде ненулевые errorlevel выходные данные для calc.exe и explorer.exe и 0 для notepad.exe .

В моей среде ( Windows 7 ) calc.exe также возвращает 0 и ваш фрагмент кода работает должным образом.

Также учтите, что некоторые программы могут возвращать ненулевой код завершения в случае успеха - это не что-то ограниченное.


На основена этом и на том факте, что первое упражнение не должно быть слишком сложным - предположим, что ваш фрагмент кода является ответом.

Если, несмотря на это, вам все еще нужно найти решение, вы можете сделать это (командные команды здесь, не Java ):

  1. Выполнить calc.exe :

    calc.exe

  2. Найти PID процесса calc.exe :

    tasklist /v /fo csv | findstr /i "calc.exe"

  3. Запустить бесконечную проверкупроцесса по PID с break;, когда процесс больше не представлен, например, с помощью команды (при условии PID = 1111):

    tasklist /fi "pid eq 1111"

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