Привет, я пытаюсь остановить 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);
}
Спасибо, что это отличная информация. – Brett
Hi Ian Lovejoy Ваше предложение имеет смысл, за исключением того, что я потерялся, как это сделать. Могу ли я попросить совета – Brett
Эй, Брет, конечно. Допустим, вы хотите, чтобы один из них запускался одновременно. Когда вы начинаете свой собственный Thread (скажем, класс MyThread), вы храните Process внутри него. Затем вы сохраняете ссылку на MyThread в статической переменной, чтобы потом вернуться к ней. Когда вы хотите уничтожить процесс, получите MyThread из статической переменной, а затем получите Process from MyThread. Убивание процесса прекратит его вывод, поэтому поток перестанет работать сам по себе (как вы уже нашли). Если вы хотите разрешить несколько, просто используйте статический список. Удачи! –