スレッド内でJavaプロセスビルダーを使用してコマンドラインのperlプロセスを開始しました。私のjavafxアプリケーションを閉じると、perl.exeプロセスは動作し続けます。スレッドで開始されたコマンドラインプロセスを停止できません(javafx)
cmdのプロセスの入力ストリームを閉じて、そのスレッドを停止します。
私はすでに、ステップの下に試してみました:
- にSystem.exit
- process.getInputStream.close
- はまた、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
すべてのコメントは、私の提案はうまくありませんの? – GhostCat
ヒント:他の人にあなたの時間を過ごさせてもらいたい。ですから、コードのすべての**を適切にフォーマット/インデントするためには5分かかります。そのような(ごめんなさい)混乱をここにドロップする代わりに。 – GhostCat
私はそれを解決しました。 javaスレッドは別のプロセスを開始するので、destroyを呼び出した後にはkillされません。 ProcessBuilder pb3 =新しいProcessBuilder(新しいString [] {"cmd.exe"、 "/ c"、 "taskkill/im \" perl.exe \ "/ f"}); プロセスpr13 = pb3.start(); –