2017-02-10 6 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クラス:

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ボタン:

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を呼び出した後にはkillされません。 ProcessBuilder pb3 =新しいProcessBuilder(新しいString [] {"cmd.exe"、 "/ c"、 "taskkill/im \" perl.exe \ "/ f"}); プロセスpr13 = pb3.start(); –

答えて

1

javaスレッドは別のプロセスを開始するので、destroyを呼び出した後にはkillされません。次のコマンドは、すべて 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()方法は、プロセスオブジェクトを返します。

これは、destroy()の方法です。単にそれを呼んでください!

+0

ヒント:ここであなたのコメントをすべて削除することができます。良い職人は常に自分のものを整理しておく。よいコーダーやSOコミュニティーのメンバーのために同じ;-) – GhostCat

関連する問題