Thread Problem


#1

Guten Morgen allerseits

Ich habe folgendes Problem:

Ich bekomme per Socket Verbindung Daten die ich in meiner GUI darstellen muss. In JavaFX muss ja alles was dargestellt wird auch über den FX application thread laufen.

Deshalb habe ich die ganze TCP Klasse über einen Task laufen:

public class TCPRob1 extends Task {

Ueber die Call Methode erfolgt dann der aufruf des Senden und Empfangen.

	protected Object call() throws Exception {
		// TCP Verbindung aufbauen
		tcpAufbauen();
		
		while (true) {

			if (verbindungAufgebaut) {
				tcpSenden();

				tcpEmpfangen();

			}
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}```

In der Main Methode des Programs starte ich den Task mit einem Thread:

```private Task tcpRob1;

// TCP Task starten
tcp = new Thread(tcpRob1);
tcp.setName("TCP Task");
tcp.start();

und trotzdem kommt der bekannt Fehler sobald ich im Programm auf eine Variable zugreife die von dem TCP Task geschrieben wird:

Not on FX application thread; currentThread = TCP Task

Mache ich irgendwo einen überlegungsfehler?

Gruss und Vielen Dank


#2

Ich vermute (der entscheidene Code fehlt, der vermutlich in “tcpEmpfangen()” steckt) das du aus deinem TCP Task die GUI ändern willst. Deine überlegung die TCP sachen in nen extra Thread zu machen ist schon richtig. Allerdings müssen! Gui änderungen im FXThread laufen. -> Platform.runLater(Runnable) brauchst du dafür.
Im gegensatz zu Swing, wo es relativ gesehen (ja ich weiß ist nicht so richtig) egal ist, ist JavaFX sehr strikt.


#3

Das hatte ich bereits probiert, aber wahrscheinlich am falschen Ort.

Ich werde das nochmals anschauen.

Vielen Dank schonmal


#4

Wie gesagt müsste in einer der Methoden stehen die in deinem TCP Task bearbeitet werden


#5

So um das hier noch abzuschliessen

Du hattest vollkommen recht, ich hatte die Geschichte von der falschen Seite betrachtet:

Hier war der alte aufruf, der direkt vom Thread her in den JavaFX Thread eingreifft:

model.empfangen(utils.datenSplit(utils.datenEmpfangen(socket, 500), ";"));

model.empfangen ist im FX Thread.

Nun habe ich das so abgeändert:


			empfangen = utils.datenSplit(utils.datenEmpfangen(socket, 500), ";");

		} catch (IOException e) {
			log.warn("TCPRoboter", e);

			JOptionPane.showMessageDialog(null, message, "Warnung", JOptionPane.YES_OPTION);

			verbindungAufgebaut = false;
		}

		Platform.runLater(new Runnable() {

			@Override
			public void run() {

				model.empfangen(empfangen);
			}
		});```

Somit geht es wunderbar