2017-02-10 68 views
1

我已经在线程中使用Java进程构建器启动了命令行perl进程。当我关闭我的javafx应用程序时,perl.exe进程继续运行。无法停止在线程中启动的命令行进程(在javafx中)

我想关闭cmd进程的输入流并停止该线程。

我曾尝试下面的步骤已:

  1. System.exit
  2. process.getInputStream.close()
  3. 还试图用java CMD处理(TASKKILL/F/IM perl的杀过程。 EXE)

代码:

MyRunnable CLASS:

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) 
       {  
       } 
      } 
      } 

主类:

两个按钮:

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(); 
     }}); 

STOP BUTTON:

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 = new ProcessBuilder(new 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

的的ProcessBuilder start()方法返回一个Process对象。

那有一个destroy()方法。只需致电!

+0

提示:你可以在这里删除你所有的评论。好的工匠总是保持他们的东西有序;对于优秀的编码人员或SO社区成员来说也是如此;-) – GhostCat