Guten Abend
Ich hatte die letzten Tage massive Probleme mit meiner Software. Kurze Erklärung:
Ich habe einen Kommunikationsthread und den JavaFX Thread zur Visualisierung. Hier der Kommunikationsthread:
protected Object call() throws Exception {
// Endlosschleife
while (true) {
// Verbindung herstellen wenn nicht bereits hergestellt
if ((verbinden) && (!connection.get())) {
StartConnection();
verbinden = false;
}
// Verbindung trennen
if ((trennen) && (connection.get())) {
StopConnection();
trennen = false;
}
// Daten abholen sobald die Verbindung steht
if (connection.get()) {
// Daten lesen
float lIstSpannung = readFloatData(Nodave.DB, 200, 0);
float lIstStrom = readFloatData(Nodave.DB, 200, 4);
float lLadezustand = readFloatData(Nodave.DB, 200, 8);
// Daten schreiben
WriteBinareData(Nodave.DB, 201, 0, 0, verwRob.getLaser());
WriteBinareData(Nodave.DB, 201, 0, 1, verwBB.isBBsteht());
Platform.runLater(new Runnable() {
public void run() {
istSpannung.set(lIstSpannung);
istStrom.set(lIstStrom);
ladezustand.set(lLadezustand);
}
});
}
Thread.sleep(500);
}
}```
Im Normalbetrieb funktioniert alles. Sobald ich jedoch einen Alert aufmache mit
.showAndWait()
trennt es mir die Verbindung.
Nun meine Theorie:
Innerhalb meines Kommunikationsthreads schreibe ich in Propertys die Werte die ich dem Model danach übergebe:
``` Platform.runLater(new Runnable() {
public void run() {
istSpannung.set(lIstSpannung);
istStrom.set(lIstStrom);
ladezustand.set(lLadezustand);
}
});```
Sobald ich nun mit
.showAndWait()
ein Alert öffne bleibt der Kommunikationsthread an dieser stelle stehen und die Verbindung wird vom Partner getrennt das das Lifebit fehlt.
Mittlerweile finde ich dies auch den falschen Aufbau und werde den Property ins Model machen, und vom Kommunikationsthread via Getter den Wert holen. So spare ich mir das RunLater und das Problem sollte gelöst sein?
Vielen Dank schonmal
*** Edit ***
Was mich auf die nächste Frage bringt:
Ich möchte das sich der Wert alle 500ms in der GUI aktualisiert, sol ich dafür einen Thread machen?
*** Edit ***
``` ScheduledService<Boolean> svc = new ScheduledService<Boolean>() {
protected Task<Boolean> createTask() {
return new Task<Boolean>() {
@Override
protected Boolean call() throws Exception {
uFConnection.set(ueberwFahrzeug.isConnection());
System.out.println(test++);
return true;
}
};
}
};
svc.setPeriod(Duration.millis(500));
svc.start();```