2017-02-10 13 views
1

Я начал процесс командной строки командной строки с использованием Java-процесса в потоке. Когда я закрываю приложение javafx, процесс perl.exe продолжает работать.Не удалось остановить процесс командной строки, запущенный в потоке (в javafx)

Я хочу закрыть поток потока cmd процесса и остановить эту нить.

Я попытался следующие шаги: уже

  1. System.exit
  2. process.getInputStream.close()
  3. также пытались убить процесс с помощью Java CMD процесс (Taskkill/ж/им Perl. ехе)

код:

MyRunnable КЛАСС:

public class MyRunnable implements Runnable 
    { 
     private final int value; 
     private Boolean stop = false; 
     MyRunnable(int value) 
     { 
      this.value = value; 
     } 
     @Override 
     public void run() 
      { 
      try 
       { 
        ProcessBuilder pb2 = new ProcessBuilder(new String[] { "cmd.exe", "/c", "perl E:\\PerlRunner\\SCRIPTS\\AIRPLANE.pl SP9830A510159222101"}); 
        Process pr12=pb2.start(); 
        Thread.sleep(1000); 
        BufferedReader brq = new BufferedReader(new InputStreamReader(pr12.getInputStream())); 
        while(brq.readLine()!=null && Variables.flag) 
        { 
        System.out.println(brq.readLine()+" FLAG:IN WHILE"+Variables.flag); 
        } 
        if(!Variables.flag) 
        { 
        pr12.destroy(); 
        System.out.println("PROCESS DESTOYED:"+Variables.flag); 
        } 

       } 
       catch(IOException ee) 
       { 

       } 
       catch(InterruptedException rr) 
       {  
       } 
      } 
      } 

ГЛАВНЫЙ КЛАСС:

TWO КНОПКИ:

PLAY:

btn.setOnAction(new EventHandler<ActionEvent>() { 

     @Override 
     public void handle(ActionEvent event) { 
      Variables.flag=true; 
      System.out.println("Start"); 
      MyRunnable n1= new MyRunnable(0); 
       Thread t1=new Thread(n1); 
       t1.start(); 
     }}); 

КНОПКА:

btn1.setOnAction(new EventHandler<ActionEvent>() { 

     @Override 
     public void handle(ActionEvent event) { 
      Variables.flag=false; 
     }}); 

Variables.flag статическая переменная, определенная внутри другого класса.

процесс Perl:

#!/usr/bin/perl 
    $devices = $ARGV[0]; 
    $temp = 0; 
    $LOGFILE = "E:\\PerlRunner\\times.txt"; 
    open(LOGFILE) or die("Could not open log file."); 
    foreach $line (<LOGFILE>) {   
    if (index($line, "flmTimes") != -1) 
    { 
    my $result = index($line, "="); 
    $temp = substr($line, $result + 1); 
    } 
    sleep(1); 
    } 
    for($i=1; $i<=$temp;$i++) 
    { 
    system("adb -s $devices shell am start -a 
    android.settings.AIRPLANE_MODE_SETTINGS"); 
    sleep 5; 
    system("adb -s $devices shell input tap 200 200"); 
    sleep 35; 
    system("adb -s $devices shell input keyevent KEYCODE_HOME"); 
    sleep 3; 
    } 

    times.txt : 
    testTimes=1 
    flmTimes=3 
    mtcTimes=1 
    caseTimes=1 
+0

Любые комментарии, это мое предложение работать? – GhostCat

+0

Подсказка: вы хотите, чтобы другие проводили время, чтобы помочь вам. Таким образом, пожалуйста, возьмите 5 минут, необходимых для правильного форматирования/отступов ** всего ** вашего кода; вместо того, чтобы сбросить такой (извините) беспорядок здесь. – GhostCat

+0

Я решил это. Поскольку поток java запускает другой процесс, поэтому он не убивается после вызова destroy. ProcessBuilder pb3 = новый ProcessBuilder (новый String [] {"cmd.exe", "/ c", "taskkill/im \" perl.exe \ "/ f"}); Процесс pr13 = pb3.start(); –

ответ

1

Поскольку поток java запускает другой процесс, поэтому он не убивается после вызова destroy. Следующая команда избавляется от все процесса PERL и, таким образом, решает проблему:

ProcessBuilder pb3 = new ProcessBuilder(new String[] { "cmd.exe", "/c", "taskkill /im \"perl.exe\" /f"}); 
Process pr13=pb3.start(); 
+0

Одно замечание здесь: поймите, что это убивает ** все ** ваши процессы perl. Поэтому, когда у вас есть * любой * другой perl, работающий в этой системе, это не имеет никакого отношения к вашему приложению ... это тоже будет убито! – GhostCat

1

start() метод ProcessBuilder возвращает объект Process.

У этого есть destroy() способ. Просто позвоните!

+0

Подсказка: здесь вы можете удалить все свои комментарии. Хороший мастер всегда держит свои вещи в порядке; то же самое для хороших кодеров или членов сообщества SO ;-) – GhostCat