Ich weis, dass hier schon recht viel zu dem Thema gepostet wurde, aber ich bin leider immer noch nicht schlauer. Ich stehe halt mit Threads schon lange auf Kriegsfuß. :cry:
Nun aber zu meinem Problem:
ich habe ein Fenster, dass nach einem Klick (und natürlich richtigen Einstellungen) eine 10MB große Datei herunterlädt um damit die Transferrate zu ermitteln.
Das funktioniert soweit auch schon, allerdings ist die GUI natürlich solange eingefroren. Deshalb habe ich eine ProgressBar eingebaut, und die zeitintensive Methode in einem andern Thread ausgelagert.
Ich versuche über wait() und notify() die Kommunikation der Threads zu regeln.
Leider bekomme ich immer eine IllegalMonitorStateException.
Hier ein Codeausschnitt:
Vielleicht kann mir jemand ein paar Tipps geben, oder ein paar Fehler aufdecken.
Vielen Dank schon mal!
Nun aber zu meinem Problem:
ich habe ein Fenster, dass nach einem Klick (und natürlich richtigen Einstellungen) eine 10MB große Datei herunterlädt um damit die Transferrate zu ermitteln.
Das funktioniert soweit auch schon, allerdings ist die GUI natürlich solange eingefroren. Deshalb habe ich eine ProgressBar eingebaut, und die zeitintensive Methode in einem andern Thread ausgelagert.
Ich versuche über wait() und notify() die Kommunikation der Threads zu regeln.
Leider bekomme ich immer eine IllegalMonitorStateException.
Hier ein Codeausschnitt:
Code:
//(...)
private Object lock = new Object() ;
//(...)
//wird nach einem Buttonklick aufgerufen
private void btnSubmitActionPerformed(java.awt.event.ActionEvent evt) {
verarbeitung_ref.server_file = txtServer.getText() ;
//Thread starten
SendWorker sw_ref = new SendWorker() ;
sw_ref.start() ;
//Submit - Button deaktivieren
btnSubmit.setEnabled(false) ;
//JProgressBar sichtbar machen
prgBar.setVisible(true) ;
prgBar.setIndeterminate(true) ;
try
{
Thread me = Thread.currentThread() ;
synchronized(lock)
{
me.wait() ;
}
}
catch (InterruptedException ex)
{
ex.printStackTrace();
}
//OHNE Threads: das wird benutzt wenn ich keine zusätl. Threads nehme
// verarbeitung_ref.gesendet = verarbeitung_ref.send() ;
prgBar.setIndeterminate(false) ;
prgBar.setVisible(false) ;
btnSubmit.setEnabled(true) ;
//bei geglückter Ausführung von send
if (verarbeitung_ref.gesendet)
{
lblStatus.setForeground(new Color (0, 0, 0)) ;
lblStatus.setText("") ;
lblStatus.setText(verarbeitung_ref.status) ;
}
//im Fehlerfall
else
{
//weiterer Code
}
//(...) weitere Methode, speichert Ergebnisse in Datei
}
class SendWorker extends Thread
{
public void run()
{
//dies ist eine Methode, die z.B ein 10MB große
//Datei herunterlädt, dies dauert natürlich,
//deswegen soll auch eine Progressbar angezeigt werden
verarbeitung_ref.gesendet = verarbeitung_ref.send() ;
synchronized(lock)
{
notify() ;
}
}
}
//(...)
Vielleicht kann mir jemand ein paar Tipps geben, oder ein paar Fehler aufdecken.
Vielen Dank schon mal!