2014-12-16 3 views
0

Привет, я пытаюсь остановить Thread и остановить FFmpeg от продолжения в bachground. Поэтому, когда пользователь нажимает кнопку отмены, он останавливает поток и останавливает FFmpeg. Сначала я покажу свой класс MashRocks, кнопка вызывает метод, поэтому я думаю, что все, что я должен показать.Tyring to stop Thread and stop ffmpeg in background

package my.mashformcnts; 
import java.io.IOException; 
import java.util.Scanner; 
import java.util.regex.Pattern; 


/** 
* 
* @author brett 
*/ 
public class MashRocks { 

    public static Thread startThread(MashFormCnts mashFormCnts) throws IOException { 
     ProcessBuilder pb = new ProcessBuilder("ffmpeg", "-i", "C:\\Users\\brett\\Documents\\Telegraph_Road.mp4", "C:\\Users\\brett\\Documents\\out.mp4"); 
     final Process p = pb.start(); 
     // create a new thread to get progress from ffmpeg command , override 
     // it's run method, and start it! 
     Thread t = new Thread() { 
      @Override 
      public void run() { 
       Scanner sc = new Scanner(p.getErrorStream()); 
       // Find duration 
       Pattern durPattern = Pattern.compile("(?<=Duration:)[^,]*"); 
       String dur = sc.findWithinHorizon(durPattern, 0); 
       if (dur == null) { 
        throw new RuntimeException("Could not parse duration."); 
       } 
       String[] hms = dur.split(":"); 
       double totalSecs = Integer.parseInt(hms[0]) * 3600 + Integer.parseInt(hms[1]) * 60 + Double.parseDouble(hms[2]); 
       System.out.println("Total duration: " + totalSecs + " seconds."); 
       // Find time as long as possible. 
       Pattern timePattern = Pattern.compile("(?<=time=)[\\d:.]*"); 
       String match; 
       String[] matchSplit; 
       //MashForm pgbar = new MashForm(); 
       while (null != (match = sc.findWithinHorizon(timePattern, 0))) { 
        matchSplit = match.split(":"); 
        double progress = (Integer.parseInt(matchSplit[0]) * 3600 + Integer.parseInt(matchSplit[1]) * 60 + Double.parseDouble(matchSplit[2]))/totalSecs; 
        int prog = (int) (progress * 100); 
        mashFormCunts.setbar(prog); 
       } 
      } 
     }; 
     t.start(); 
     return t; 
    } 
    //This works but is it correct?? 
    public synchronized static Thread stop(Thread t){ 
     Runtime.getRuntime().exec("taskkill /F /IM ffmpeg.exe"); 
     t = null; 
     //t.interrupt(); 
      //im not sure what else to do? 


    } 
} 

Кроме того, в моей форме это код им с помощью, чтобы получить тему и отправить его в метод

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {           
     // TODO add your handling code here: 
     Thread t = Thread.currentThread(); 
     System.out.print(t); 
     MashRocks.stop(t); 
    } 

ответ

1

Вы правы, что есть лучший путь. Вы должны где-то сохранить значение Process и использовать Process.destroyForcibly() для его завершения. На основе кода, который вы опубликовали, вы можете захотеть подкласса Thread, чтобы у вас было место для хранения процесса, к которому вы можете легко вернуться.

Вам также необходимо сохранить ссылку на свой пользовательский объект Thread при его запуске. Если может быть только один за раз, вы можете использовать singleton для хранения одного экземпляра. Если их несколько, вам нужно создать список или реестр активных потоков.

+0

Спасибо, что это отличная информация. – Brett

+0

Hi Ian Lovejoy Ваше предложение имеет смысл, за исключением того, что я потерялся, как это сделать. Могу ли я попросить совета – Brett

+0

Эй, Брет, конечно. Допустим, вы хотите, чтобы один из них запускался одновременно. Когда вы начинаете свой собственный Thread (скажем, класс MyThread), вы храните Process внутри него. Затем вы сохраняете ссылку на MyThread в статической переменной, чтобы потом вернуться к ней. Когда вы хотите уничтожить процесс, получите MyThread из статической переменной, а затем получите Process from MyThread. Убивание процесса прекратит его вывод, поэтому поток перестанет работать сам по себе (как вы уже нашли). Если вы хотите разрешить несколько, просто используйте статический список . Удачи! –