SwingWorker stoppen

Carcharoth

Bekanntes Mitglied
Guten Tag

Ich habe einen SwingWorker den ich mit einem Button auf der GUI stoppen möchte.
In der Methode doInBackground, habe ich eine Berechnungsschlaufe und darin habe ich folgende Bedingung eingebaut.

Java:
protected Void doInBackground() throws Exception {
    while (savings.getEinsparungen().size()!=0) {
        if (isCancelled()) {
            return null;
        }
        ArrayList<Weg> toursKopie = new ArrayList<Weg>(savings.iterate());
        publish(toursKopie);
    }
    return null;
}

Problem 1: wenn der User auf den Button klickt, weiss ich nicht, ob der SwingWorker bereits existiert / läuft. Ich habe es mit folgendem Workaround gelöst, aber scheint mir nicht sehr sauber. Gibt es eine bessere Lösung ?

Java:
try {
    workerVRP.cancel(true);
} catch (Exception e) {}

Problem 2: wenn ich den SwingWorker wie oben beschrieben stoppe, dann läuft er noch einen kurzen Moment (ich nehme an, er muss erstmal auf die Bedingung isCancelled treffen. Nach dem Stoppen des SwingWorkers will ich aber die grafische Darstellung auf meiner GUI bereinigen. Wenn ich das gerade im Anschluss zum Stopbefehl mache, hat der SwingWorker scheinbar nochmal Zeit die grafische Darstellung nach dem bereinigen zu zeichnen und sie ist nicht mehr bereinigt.
Wie kann ich abfragen, ob der SwingWorker nun effektiv gestoppt ist?

Danke für eure Tipps.
 

KonradN

Super-Moderator
Mitarbeiter
Problem 1: wenn der User auf den Button klickt, weiss ich nicht, ob der SwingWorker bereits existiert / läuft. Ich habe es mit folgendem Workaround gelöst, aber scheint mir nicht sehr sauber. Gibt es eine bessere Lösung ?
Das kann man ja alles prüfen. Du hast ihn ja in der Variable. Also kannst du prüfen:
  • ist die Variable null?
  • Du kannst getState() abprüfen sowie isCanceled().

Dann solltest Du den Button auch nur dann anbieten (aktivieren), wenn auch wirklich ein SwingWorker läuft. Du solltest also immer wissen, was der aktuelle Zustand ist und entsprechend die UI aktualisieren.

ich nehme an, er muss erstmal auf die Bedingung isCancelled treffen.
Ja genau, das ist richtig.

Wie kann ich abfragen, ob der SwingWorker nun effektiv gestoppt ist?
getState() gibt dir den State des BackgroundWorkers zurück (sowie auch isCanceled() )
Der State geht von PENDING auf STARTED hin zu DONE
 

Carcharoth

Bekanntes Mitglied
Ich habe nun wie folgt versucht eine kleine Methode zu schreiben, um den Swingworker zu stoppen und zu warten bis er effektiv stoppt.
Der Worker stoppt aber ich habe nicht das Gefühl, dass dieser Code wirklich darauf wartet, dass der Worker fertig ist. Lässt sich auch nur schwer sagen, da das ganze schnell geht.
Was denkt ihr, theoretisch betrachtet ?

Java:
if (workerVRP.getState()==SwingWorker.StateValue.STARTED) {
    workerVRP.cancel(true);
    while (workerVRP.getState()!=SwingWorker.StateValue.DONE) {}
}
 

KonradN

Super-Moderator
Mitarbeiter
Also das ist so ganz schlecht:
a) Das läuft ja im UI Thread - damit hast Du den blockiert, bis der SwingWorker gestoppt ist.
b) Die while Schleife läuft mit 100% Last - das ist also auch extrem schlecht. Bei so aktivem Warten (das man eigentlich nie machen sollte, wenn es sich vermeiden lässt) muss immer ein sleep Aufruf mit rein, damit man eben nicht unnötig Last erzeugt.

Du hat eine Event basierte Lösung. Wieso kann nicht der SwingWorker ein Event auslösen, wenn er fertig ist? So Du da etwas machen musst. Dann kannst Du reagieren und machen, was auch immer du nach dem canceln machen möchtest.
 

Carcharoth

Bekanntes Mitglied
Ok. Ich verfolge also den Ansatz aus dem SwingWorker heraus.

1. Der User klickt also auf den Button zum Abbrechen.
2. Der Listener vom Button setzt den Worker.cancel auf true.

Java:
btnStopp.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent arg0) {
        if (workerVRP.getState()==SwingWorker.StateValue.STARTED) {
            workerVRP.cancel(true);
        }
    }
});

3. Nach kurzer Zeit, wird die Bedingung auf isCancelled in der Methode doInBackground vom Worker erreicht und es wird abgebrochen.
4. Ich gehe davon aus, wenn ich ein event feuern will, dann hier, vor dem eigentlichen Abbrechen des Workers.

Java:
protected Void doInBackground() throws Exception {
    while (savings.getEinsparungen().size()!=0) {
        if (isCancelled()) {
            // fire event ?
            return null;
        }
        ArrayList<Weg> toursKopie = new ArrayList<Weg>(savings.iterate());
        publish(toursKopie);
    }
    return null;
}

Nur, wie mache ich das konkret ?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C SwingWorker mit Fehler Java Basics - Anfänger-Themen 2
C Threads SwingWorker läuft trotz cancel weiter Java Basics - Anfänger-Themen 22
O Swingworker/Thread Java Basics - Anfänger-Themen 3
S SwingWorker Java Basics - Anfänger-Themen 3
G SwingWorker funktioniert nicht korrekt Java Basics - Anfänger-Themen 16
G Unterschied zwischen SwingWorker und "normalem" Th Java Basics - Anfänger-Themen 3
J Erste Schritte Unendlichen Loop stoppen Java Basics - Anfänger-Themen 2
C NumberFormatException: null ohne Ausnahmebehandlung stoppen Java Basics - Anfänger-Themen 7
B Thread / Prozess stoppen? Java Basics - Anfänger-Themen 22
B Schleife von anderer Methode stoppen? (Start continue) Java Basics - Anfänger-Themen 18
D While Schleife bei Bedarf durch Eingabe stoppen Java Basics - Anfänger-Themen 15
mobaer Swing Timer stoppen Java Basics - Anfänger-Themen 3
S Sound stoppen und nach Pause wieder abspielen Java Basics - Anfänger-Themen 6
B Gleicher Prozess starten und stoppen (Problem beim Stoppen) Java Basics - Anfänger-Themen 5
B MySQL starten / stoppen -> Stoppen erzeugt neuen Prozess Java Basics - Anfänger-Themen 0
B @Schedule stoppen Java Basics - Anfänger-Themen 0
M bufferedreader loop stoppen Java Basics - Anfänger-Themen 2
S clip.loop(Clip.LOOP_CONTINUOUSLY); stoppen klappt nicht! Java Basics - Anfänger-Themen 11
O Thread aus dem Thread stoppen Java Basics - Anfänger-Themen 6
G Thread stoppen mit System.in.read() Java Basics - Anfänger-Themen 13
C Timer aus anderer Klasse stoppen/starten Java Basics - Anfänger-Themen 3
I JDK SERVER -jar stoppen Java Basics - Anfänger-Themen 5
L Array - Nach 2 gleichen Werten stoppen Java Basics - Anfänger-Themen 5
M Threads von Gui Thread starten und stoppen Java Basics - Anfänger-Themen 2
J Threads stoppen mit interrupt - Frage dazu Java Basics - Anfänger-Themen 7
Screen Threads Wie thread stoppen/closen ? und wie GUI at runntime updaten? Java Basics - Anfänger-Themen 10
S Threads JUnitCore stoppen? Java Basics - Anfänger-Themen 6
I Thread stoppen und starten Java Basics - Anfänger-Themen 3
N Mehrere Threads starten/stoppen Java Basics - Anfänger-Themen 4
S While stoppen Java Basics - Anfänger-Themen 8
Z Objekte in der Verarbeitung stoppen Java Basics - Anfänger-Themen 2
A Jlayer: Wie sound stoppen der in einem Thread läuft Java Basics - Anfänger-Themen 7
S Thread stoppen ohne stop()? Java Basics - Anfänger-Themen 13
Dit_ Thread stoppen und wieder starten Java Basics - Anfänger-Themen 2
C Programm stoppen - Zustand speichern - später fortführen Java Basics - Anfänger-Themen 7
Dit_ Thread stoppen. Java Basics - Anfänger-Themen 15
T MySQL-Dienst starten und stoppen aus Netbeans Java Basics - Anfänger-Themen 3
O anonymen Thread stoppen Java Basics - Anfänger-Themen 4
L Zeit stoppen in mehreren Threads Java Basics - Anfänger-Themen 2
0 a hoch b rekursiv - wie stoppen? Java Basics - Anfänger-Themen 3
G Thread stoppen? Java Basics - Anfänger-Themen 4
T Thread stoppen Java Basics - Anfänger-Themen 4
S Stoppuhr - starten, stoppen, pausieren Java Basics - Anfänger-Themen 2
F Zeit stoppen Java Basics - Anfänger-Themen 6
B Thread will einfach nicht stoppen Java Basics - Anfänger-Themen 12
loadbrain Thread stoppen Java Basics - Anfänger-Themen 7
G Methode stoppen Java Basics - Anfänger-Themen 17
L threat stoppen Java Basics - Anfänger-Themen 4
7 Thread will nicht stoppen Java Basics - Anfänger-Themen 2
F Thread nach unaktivitätszeit stoppen Java Basics - Anfänger-Themen 7
N Thread soll nur einmal ausgeführt werden, aber wie stoppen? Java Basics - Anfänger-Themen 5
T Thread stoppen und wieder starten. Java Basics - Anfänger-Themen 4
G Thread stoppen Java Basics - Anfänger-Themen 7
frau-u Threads stoppen Java Basics - Anfänger-Themen 11
G Hauptprogramm stoppen Java Basics - Anfänger-Themen 6
D String lesen und bei bestimmtem Buchstaben stoppen Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben