SwingWorker setProgress Problem

gerdgerdgerd

Aktives Mitglied
Hallo zusammen,

ich habe einen Methode als SwingWorker implementiert, da ansonsten das Hauptprogramm warten würde. Um den Benutzer ein Feedback zu geben möchte ich den ProgressMonitor verwenden. Soweit ist auch alles klar. Nur wird bei mir der registrierte PropertyChangeListener nicht aufgerufen, wenn ich den Progress mit setProgress neu setze.

setProgress
protected final void setProgress(int progress)

Sets the progress bound property. The value should be from 0 to 100.

Because PropertyChangeListeners are notified asynchronously on the Event Dispatch Thread multiple invocations to the setProgress method might occur before any PropertyChangeListeners are invoked. For performance purposes all these invocations are coalesced into one invocation with the last invocation argument only.

For example, the following invokations:

setProgress(1);
setProgress(2);
setProgress(3);


might result in a single PropertyChangeListener notification with the value 3.

Hier ist nun mein Quellcode:

Java:
public class TestSwingWorker extends SwingWorker<Void, Void> {

	private Cube cube;
	private List<Element> allElements;

	public TestSwingWorker(List<Element> elements) {
		allElements = elements;
	}

	@Override
	protected Void doInBackground() throws Exception {
		System.out.println("ENTER doInBackground()");

		setProgress(0);

		final int totalElementCount = allElements.size();
		int currentElementCount = 0;

		for (Element currentElement : allElements) {

			// do something
			if (++currentElementCount % 50 == 0 || currentElementCount >= totalElementCount) {
				int currentProgress = (int) ((double)currentElementCount / (double)totalElementCount * 100);
				System.out.println("setProgress " + currentProgress);
				setProgress(currentProgress);
			}
		}

		System.out.println("return null");
		return null;
	}

	@Override
	protected void done() {
		System.out.println("ENTER done()");

		// do something
	}
}


TestSwingWorker swingWorker = new TestSwingWorker(allElements);
swingWorker.addPropertyChangeListener(new PropertyChangeListener() {
	@Override
	public void propertyChange(PropertyChangeEvent event) {
		System.out.println("ENTER propertyChange()");
	}
});
swingWorker.execute();

Ich habe extra schon mit % 50 nur jede 50 Wertänderung mit setProgress gesetzt, trotzdem wird der PropertyChangeListener nicht aufgerufen. Hier die dazugehörige Console Ausgabe:

ENTER doInBackground()
ENTER propertyChange()
setProgress 6
setProgress 12
...
setProgress 96
setProgress 100
retturn null

Eigentlich sollte er danach die done() Methode aufrufen. Also irgendwie scheint da etwas nicht so zu funktionieren, wie ich das gerne möchte :)

Danke
 
G

Gast2

Gast
Du solltest erstmal setProgress nicht im backround thread aufrufen weil du bist im falschen Thread um die UI zu aktualisieren...
 
S

SlaterB

Gast
Java:
public class Test
{
    public static void main(String[] args)
    {
        TestSwingWorker swingWorker = new TestSwingWorker();
        swingWorker.addPropertyChangeListener(new PropertyChangeListener()
            {
                @Override
                public void propertyChange(PropertyChangeEvent event)
                {
                    System.out.println("ENTER propertyChange(): " + event.getPropertyName() + ", " + 
                       event.getNewValue());
                }
            });
        swingWorker.execute();
    }
}

class TestSwingWorker
    extends SwingWorker<Void, Void>
{


    @Override
    protected Void doInBackground()
        throws Exception
    {
        System.out.println("ENTER doInBackground()");

        for (int i = 0; i < 10; i++)
        {
            System.out.println("setProgress: " + (i * 10));
            setProgress(i * 10);
            Thread.sleep(400);
        }
        setProgress(100);

        System.out.println("return null");
        return null;
    }

    @Override
    protected void done()
    {
        System.out.println("ENTER done()");

        // do something
    }
}
Ausgabe:
ENTER doInBackground()
setProgress: 0
ENTER propertyChange(): state, STARTED
setProgress: 10
ENTER propertyChange(): progress, 10
setProgress: 20
ENTER propertyChange(): progress, 20
setProgress: 30
ENTER propertyChange(): progress, 30
setProgress: 40
ENTER propertyChange(): progress, 40
setProgress: 50
ENTER propertyChange(): progress, 50
setProgress: 60
ENTER propertyChange(): progress, 60
setProgress: 70
ENTER propertyChange(): progress, 70
setProgress: 80
ENTER propertyChange(): progress, 80
setProgress: 90
ENTER propertyChange(): progress, 90
return null
ENTER propertyChange(): progress, 100
ENTER done()
ENTER propertyChange(): state, DONE
 

gerdgerdgerd

Aktives Mitglied
ich habe gerade herausgefunden, das dies ein Problem mit dem quellcode ist den ich ausführe, denn mit Thread.sleep(400) geht es bei mir auch. Das ist mein Quellcode den ich ausführe:

Java:
Cube cube = null;
		for (GridElement currentElement : gridElements) {

			if (currentElement instanceof Grid2DElement) {
				Grid2DElement elem = (Grid2DElement) currentElement;

				Vertex coords = elem.getCoordinates();
				if (cube == null) {
					cube = new Cube();
					cube.setName(name);
					cube.setHeight(height);
					cube.setWidth(elem.getWidth());
					cube.setDepth(elem.getHeight());
					cube.setAmbient(1f, 1f, 1f);
					cube.setX(coords.x);
					cube.setZ(coords.z);
					cube.setY(0);
					cube.setAngle(0, 0, 0);
				} else {
					SubCube currentSubCube = new SubCube();
					currentSubCube.setParent(cube);
					currentSubCube.setHeight(height);
					currentSubCube.setWidth(elem.getWidth());
					currentSubCube.setDepth(elem.getHeight());
					currentSubCube.setAmbient(1f, 1f, 1f);
					currentSubCube.setX(coords.x);
					currentSubCube.setZ(coords.z);
					currentSubCube.setY(0);
					currentSubCube.setAngle(0, 0, 0);

					cube.addSubcube(currentSubCube);
				}
			}

			if (++currentElementCount % 50 == 0 || currentElementCount >= totalElementCount) {
				Thread.sleep(100);
				int currentProgress = (int) ((double) currentElementCount / (double) totalElementCount * 100);
				System.out.println("setProgress " + currentProgress);
				setProgress(currentProgress);
			}
		}

sobald ich folgendes auskommentiere, funktioniert es wunderbar und der PropertyChangeListener wird aufgerufen :
Java:
if (cube == null) {
					cube = new Cube();
					cube.setName(name);
					....
				} else {
					SubCube currentSubCube = new SubCube();
					currentSubCube.setParent(cube);
					currentSubCube.setHeight(height);
					....

					cube.addSubcube(currentSubCube);
				}
 
Zuletzt bearbeitet:
S

SlaterB

Gast
besteht eine Frage?
alles was weniger als ein Wimpernschlag dauert, kann zu langsam sein, als dass Swing immer sofort reagiert
 

Sonecc

Gesperrter Benutzer
Da ich cube der subcube nicht kenne und das Problem wie du sagst, beim erzeugen eines der Objekte auftritt, schließe ich einfach mal darauf, dass dort etwas nicht threadsicher ist, oder eben etwas geworfen wird

Edit: Eventuell addSubCube()... ?
Was für eine Datenstruktur liegt dahinter?
 
Zuletzt bearbeitet:

gerdgerdgerd

Aktives Mitglied
ich habe Throwable in einem try catch abgefangen, aber es wurde nichts geworfen. Leider hängt Cube und SubCube mit zuviel zusammen und ist sehr OpenGL spezifisch aufgebaut.
Er läuft ja im Prinzip auch sauber durch, was man anhand der ausgabe auch gut sieht:

setProgress 7
setProgress 15
setProgress 23

nur will er nicht den PropertyChangeListener ausführen.

edit:
public ArrayList<SubCube> subCubes = new ArrayList<SubCube>();

Aber das läuft doch alles im gleichen thread ab?!?! ist ja nur eine for- schleife über die elemente und daraus wird ein "haupt" cube erstellt und die subcubes danach hinzugefügt.

Ich kommentiere nun einzelne zeilen aus, um das problem genauer zu lokalisieren.
 
Zuletzt bearbeitet:

Sonecc

Gesperrter Benutzer
sauber durchlaufen tut es keinesfalls, sonst hättest du keine probleme ;)
Wie gesagt, was mir so einfällt, ist dass die Datenstruktur eventuell nicht Threadsicher ist, die durch addSubCube() angesprochen wird.
Ansonsten, weiß ich leider auch nicht woran es liegen könnte
 

gerdgerdgerd

Aktives Mitglied
Also ich habe jetzt das Problem genauer lokalisiert. so funktioniert es wunderbar:
Java:
if (cube == null) {
	cube = new Cube();
	cube.setName(name);
else {
	SubCube currentSubCube = new SubCube();
	currentSubCube.setParent(cube);

	cube.addSubcube(currentSubCube);
}

sobald aber
Java:
cube.setHeight(..
aufgerufen wird, erscheint das Problem.
 

Sonecc

Gesperrter Benutzer
das ist doch schonmal ein ansatz, nun musst du "nur" noch schauen, was dort passiert, was nicht korrekt sein könnte
 

gerdgerdgerd

Aktives Mitglied
Because the GLU implementation is not thread-safe

und genau hier hängt er:

Java:
GLContext context = canvas.getContext();
context.makeCurrent();

mist, das Problem kann ich dann leider nicht umgehen, da ich ansonsten zuviel verändern müsste und das zum größten teil innerhalb von fremden quellcode.
 

Sonecc

Gesperrter Benutzer
lag ich also richtig damit, dass irgendwas nicht threadsicher ist....
Eine Threadsichere alternative gibt es nicht?
 

Ebenius

Top Contributor
Dann mach doch folgendes: Debugger (zum Beispiel im Eclipse) anschmeißen, in die Situation reinlaufen lassen, VM anhalten, Monitore angucken... Dann findest Du raus, ob zwei (oder gar mehr) Threads sich zu Tode locken...

Ebenius
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Psypsy Swing SwingWorker unterschied zwischen setProgress und process AWT, Swing, JavaFX & SWT 2
ralfb1105 Swing Frage zu SwingWorker Verhalten bei cancel() AWT, Swing, JavaFX & SWT 2
ralfb1105 Swing SwingWorker - max 10 Threats werden gestartet !? AWT, Swing, JavaFX & SWT 5
ralfb1105 Swing Ausführung einer SwingWorker Klasse stoppen AWT, Swing, JavaFX & SWT 4
ralfb1105 Swing Timer in SwingWorker stoppen AWT, Swing, JavaFX & SWT 4
S Swing SwingWorker - richtige Implementierung doInBackground() AWT, Swing, JavaFX & SWT 5
H Swing BufferedReader.close() hängt im SwingWorker AWT, Swing, JavaFX & SWT 1
Nuiton Swing SwingWorker - Prozess stoppen AWT, Swing, JavaFX & SWT 4
Thallius Auf Swingworker warten? AWT, Swing, JavaFX & SWT 5
M SwingWorker Hilfe! AWT, Swing, JavaFX & SWT 10
J Swing Nach SwingWorker Funktion aus der GUI Klasse aufrufen AWT, Swing, JavaFX & SWT 5
C Swing SwingWorker abbrechen AWT, Swing, JavaFX & SWT 12
C Swing SwingWorker: Auf beendigung eines Formulars / einer Arbeit warten AWT, Swing, JavaFX & SWT 10
A Swingworker rückgabewert verwenden AWT, Swing, JavaFX & SWT 9
B Frage zu Swing,Threads, SwingWorker und Socket Communikation AWT, Swing, JavaFX & SWT 4
M Prioritäten bei SwingWorker / Threads AWT, Swing, JavaFX & SWT 9
M Liste mittels SwingWorker füllen klappt nicht AWT, Swing, JavaFX & SWT 10
Iron Monkey SwingWorker verschwindet nicht AWT, Swing, JavaFX & SWT 10
X Prozess mit Runtime.getRuntime in SwingWorker aufrufen AWT, Swing, JavaFX & SWT 6
R Zugriff auf Model im MVC-Design aus SwingWorker heraus AWT, Swing, JavaFX & SWT 3
K Frage zu ProgressBar, SwingWorker etc. AWT, Swing, JavaFX & SWT 4
G SwingWorker AWT, Swing, JavaFX & SWT 2
J Unterschied zwischen SwingWorker und Threads AWT, Swing, JavaFX & SWT 4
S SwingWorker :( AWT, Swing, JavaFX & SWT 6
F swingworker und eventdispatch thread AWT, Swing, JavaFX & SWT 9
S SwingWorker - ich werde wahnsinnig AWT, Swing, JavaFX & SWT 4
0 SwingWorker Tutorial ? AWT, Swing, JavaFX & SWT 2
L SwingWorker Thread pausieren AWT, Swing, JavaFX & SWT 12
L SwingWorker Statusabfrage AWT, Swing, JavaFX & SWT 8
M Kann ein SwingWorker nur einmal laufen? AWT, Swing, JavaFX & SWT 2
J SwingWorker, get und boolean AWT, Swing, JavaFX & SWT 6
G Problem mit der Anzeige von jLabel. Unlesbar wenn der Text geändert wird. AWT, Swing, JavaFX & SWT 28
H 2D-Grafik Problem mit Paint AWT, Swing, JavaFX & SWT 1
S Layout - Problem AWT, Swing, JavaFX & SWT 1
Tassos JavaFX/Problem mit der Maussteuerung in Stackpane AWT, Swing, JavaFX & SWT 7
sserio Java Fx - Problem AWT, Swing, JavaFX & SWT 3
A Problem Spiel auf Panel der GUI zu bringen AWT, Swing, JavaFX & SWT 1
A JavaFX Controller Problem AWT, Swing, JavaFX & SWT 1
TheWhiteShadow JavaFX ListView Problem beim Entfernen von Elementen AWT, Swing, JavaFX & SWT 1
E LayoutManager Welcher Layout-Mix löst mein Problem? AWT, Swing, JavaFX & SWT 3
Umb3rus JavaFX Problem mit PropertyValueFactory: can not read from unreadable property AWT, Swing, JavaFX & SWT 1
T Problem mit paintComponent() AWT, Swing, JavaFX & SWT 17
AmsananKING Java Menü-Problem AWT, Swing, JavaFX & SWT 1
K JavaFX Resizing-Problem beim BorderLayout (Center Component) beim Arbeiten mit mehreren FXMLs AWT, Swing, JavaFX & SWT 2
G Instance OF Problem AWT, Swing, JavaFX & SWT 9
FrittenFritze Ein Problem mit der CSSBox, die Größe wird nicht angepasst AWT, Swing, JavaFX & SWT 5
M Problem mit dem Anzeigen von Frames im Vordergrund AWT, Swing, JavaFX & SWT 5
Badebay Problem mit JButton AWT, Swing, JavaFX & SWT 2
newJavaGeek Grid-Layout problem AWT, Swing, JavaFX & SWT 7
J JavaFX Löschen im Tabelview macht Problem AWT, Swing, JavaFX & SWT 15
JavaTalksToMe JavaFx ExekutorService Problem AWT, Swing, JavaFX & SWT 2
Zrebna Problem bei Eventhandling (Value soll nach jedem erneutem Klick gelöscht werden) AWT, Swing, JavaFX & SWT 4
B Problem mit JavaFX AWT, Swing, JavaFX & SWT 5
J css Problem AWT, Swing, JavaFX & SWT 5
B JavaFX habe mein Problem fett markiert AWT, Swing, JavaFX & SWT 2
A Swing Filter-Problem AWT, Swing, JavaFX & SWT 1
temi JavaFX Problem mit IntelliJ und JavaFx 11 unter XUbuntu AWT, Swing, JavaFX & SWT 3
L Java FX Problem mit Ubuntu 18 und JavaFx AWT, Swing, JavaFX & SWT 27
H JTable TableCellEditor-Problem AWT, Swing, JavaFX & SWT 0
kodela Swing Problem mit Warten-Dialog AWT, Swing, JavaFX & SWT 16
B JavaFx Scene Builder Problem AWT, Swing, JavaFX & SWT 2
B [Problem] Java öffnet Word-Datein nicht AWT, Swing, JavaFX & SWT 14
T DataBinding Problem AWT, Swing, JavaFX & SWT 5
Blender3D Problem mit € Symbol Font Gotham Windows 10 Swing AWT, Swing, JavaFX & SWT 11
T Problem mit JTable Sortierung AWT, Swing, JavaFX & SWT 2
J Problem mit Platfrom run later AWT, Swing, JavaFX & SWT 15
J Problem mit Platfrom run later AWT, Swing, JavaFX & SWT 0
D Swing SwingUtils / Thread Problem AWT, Swing, JavaFX & SWT 3
L JavaFX Problem beim Aufrufen einer Methode AWT, Swing, JavaFX & SWT 5
T Swing Problem mit Datum und FormattedTextField AWT, Swing, JavaFX & SWT 2
S AWT Java print dialog Problem AWT, Swing, JavaFX & SWT 0
olfibits JavaFX Problem mit HTMLEditor AWT, Swing, JavaFX & SWT 0
W SWT hover-background-problem with first column in TreeViewer AWT, Swing, JavaFX & SWT 0
M Problem mit Add JScrollPane AWT, Swing, JavaFX & SWT 25
Mario1409 Swing JTextArea scroll Problem AWT, Swing, JavaFX & SWT 0
N Swing Problem mit loop AWT, Swing, JavaFX & SWT 2
S Swing Problem mit Button und ActionListener AWT, Swing, JavaFX & SWT 5
S Swing & Clean und build Problem AWT, Swing, JavaFX & SWT 12
S JLabel setText() Problem AWT, Swing, JavaFX & SWT 6
I 2D-Grafik Problem beim Ändern der Farbe eine 2d Objekts AWT, Swing, JavaFX & SWT 3
G Swing Splitpane Problem AWT, Swing, JavaFX & SWT 1
F Problem mit der FXML Rectangle Shape AWT, Swing, JavaFX & SWT 2
N JavaFX Stranges Problem mit der Autoscroll-Eigenschaft von Textareas AWT, Swing, JavaFX & SWT 0
E Java FX FXML Problem mit html Scriptausführung AWT, Swing, JavaFX & SWT 2
J JavaFX Intersect Problem mit Shapes AWT, Swing, JavaFX & SWT 10
R JavaFX MediaPlayer AVI-Problem AWT, Swing, JavaFX & SWT 1
M Swing Problem mit ListCellRenderer AWT, Swing, JavaFX & SWT 7
D Problem mit JTable AWT, Swing, JavaFX & SWT 1
F GUI Auflösung ändern - Koordianten und Proportions Problem AWT, Swing, JavaFX & SWT 21
J Problem mit Button darstellung AWT, Swing, JavaFX & SWT 23
M Problem mit Layoutmanagern... Hilfe wäre sehr nett. AWT, Swing, JavaFX & SWT 2
S 2D-Grafik Problem mit Variablen AWT, Swing, JavaFX & SWT 4
7 JavaFX Problem beim Zeichnen eines Dreiecks in einem GUI AWT, Swing, JavaFX & SWT 6
M Swing AttributiveCellTableModel addRow() Problem AWT, Swing, JavaFX & SWT 1
J Swing Problem mit Graphics Methode AWT, Swing, JavaFX & SWT 4
N JavaFX Problem mit table multiple selection AWT, Swing, JavaFX & SWT 5
K CheckBox Problem AWT, Swing, JavaFX & SWT 5
Grevak DisplayMode Problem seit Windows 10 AWT, Swing, JavaFX & SWT 2
S Swing Eigene JComboBox Problem! AWT, Swing, JavaFX & SWT 1
B Swing Problem mit Bildpfad AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben