Hallo Gemeinde,
ich habe ein Problem mit dem Abbrechen eines Thread mit Hilfe eines “Cancel”-Button.
Ich habe mir eine Klasse (ProgressDialog) erstellt die von JDialog abgeleitet ist und in dieser wird ein Fenster mit JProgressBar, einem Label und der besagte Cancel Button definiert.
Ein Objekt meiner Klasse (EncodeThread) die den Thread darstellt wird in ProgressDialog erzeugt. Wenn ich aber den Konvertierungsvorgang abrechen will, mit Hilfe des Cancel Button, passiert nichts.
Auch ein schließen des Dialog beendet den Thread nicht. Erst wenn ich das Hauptfenster, also das Programm schließe wird auch der Prozess beendet. Ich bekomme dann eine IllegalStateException im Thread EncodeThread.
Da es für mich auch das erstemal ist das ich mit Thread arbeite ist mein Latein nun am Ende, ich weiss nicht ob ich was falsch verstanden habe oder einfach nur einen blöden Fehler drin habe.
Vielleicht kann mir jemand von euch weiterhelfen bzw. mich auf den richtigen Pfad bringen.
Hier mal die zwei Klassen die meines erachtens nach die wichtigen sind.
ProgressDialog:
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
class ProgressDialog extends JDialog implements ActionListener
{
private static JProgressBar pb = new JProgressBar(0, 100);
private static JLabel label = new JLabel("Conversion is started, please wait...");
private JButton cancelbutton;
public ProgressDialog(File source, File target)
{
super();
setSize(new Dimension(250,125));
setLocationRelativeTo( null );
setResizable( false );
setTitle("Conversion");
setModal( true );
cancelbutton = new JButton("Cancel");
cancelbutton.addActionListener( this );
JPanel panel = new JPanel();
panel.setBorder( BorderFactory.createEmptyBorder( 2, 4, 2, 4 ) );
panel.setLayout(new GridLayout(3,1));
panel.add(label);
panel.add(pb);
panel.add( cancelbutton );
EncodeThread encode = new EncodeThread(source, target);
encode.startEncoding();
add(panel);
}
public static JLabel getLabel()
{
return label;
}
public static JProgressBar getProgressBar()
{
return pb;
}
@Override
public void actionPerformed( ActionEvent evt )
{
if(evt.getSource() == cancelbutton)
{
EncodeThread.stopEncoding();
}
}
}
EncodeThread:
import it.sauronsoftware.jave.AudioAttributes;
import it.sauronsoftware.jave.Encoder;
import it.sauronsoftware.jave.EncoderException;
import it.sauronsoftware.jave.EncodingAttributes;
import it.sauronsoftware.jave.InputFormatException;
import it.sauronsoftware.jave.VideoAttributes;
import it.sauronsoftware.jave.VideoSize;
import java.io.File;
class EncodeThread extends Thread
{
private File source;
private File target;
private static Thread encodingthread;
public EncodeThread(File src, File targ)
{
source = src;
target = targ;
}
public void startEncoding()
{
encodingthread = new Thread( this);
encodingthread.setName("EncodingThread");
encodingthread.start();
}
public static void stopEncoding()
{
encodingthread.interrupt();
}
@Override
public void run()
{
while(!isInterrupted())
{
try
{
startEncode();
}
catch ( InterruptedException e )
{
interrupt();
System.err.println( e );
}
}
}
private void startEncode() throws InterruptedException
{
AudioAttributes audio = new AudioAttributes();
audio.setCodec("libmp3lame");
audio.setBitRate( new Integer(64000) );
audio.setChannels(new Integer(1));
audio.setSamplingRate( new Integer( 22050) );
VideoAttributes video = new VideoAttributes();
video.setCodec("flv");
video.setBitRate( new Integer(368640) );
video.setFrameRate( new Integer(25) );
video.setSize( new VideoSize(400, 300) );
final EncodingAttributes attr = new EncodingAttributes();
attr.setFormat("flv");
attr.setAudioAttributes(audio);
attr.setVideoAttributes(video);
try
{
Encoder encoder = new Encoder();
ProgressListener progresslistener= new ProgressListener();
encoder.encode(source, target, attr, progresslistener); throw new InterruptedException();
}
catch ( IllegalArgumentException e )
{
System.err.println(e.getMessage());
}
catch ( InputFormatException e )
{
System.err.println(e.getMessage());
}
catch ( EncoderException e )
{
System.err.println(e.getMessage());
}
}
}