Wir arbeiten an einer Signalverarbeitungsanwendung, es gibt eine bestimmte Art von Hardware im PC und einen C-Treiber, der damit kommuniziert. Die Anwendung Frontend/GUI wird in JavaFX geschrieben. Wir haben einige Probleme mit dem JavaFX LineChart, wir messen die elektrische Signalfrequenz und versuchen, sie auf dem oben erwähnten LineChart zu plotten.LineChart-Leistungsabfall im Laufe der Zeit
Die Messungen laufen in einer Schleife, bis 1000 Samples gesammelt wurden, wir haben mit 100Hz-Signal getestet, was bedeutet, dass es 10s dauert, um diese 1000 Samples zu erhalten.
Es wird ein separater 'LineChart'-Thread ausgeführt und geprüft (alle 10ms), ob neue Muster verfügbar sind. Wenn diese dem LineChart hinzugefügt werden, setzt der LineChart-Thread das LineChart zurück (löscht die Serie) Daten) und der Prozess beginnt von vorne.
Alles läuft gut für die ersten ~ 20 min, nach denen es scheint, dass das LineChart "verlangsamt", es sieht so aus, als ob die Zeichnung nicht so schnell/dynamisch wie am Anfang ist.
Wir haben so gut wie alles in der Anwendung überprüft und nichts gefunden, daher haben wir ein separates Projekt erstellt, das nur das LineChart und einen Thread enthält, der dem Diagramm alle 10ms Stichproben hinzufügt (bis zu 1000 Stichproben) . Wir haben das gleiche Verhalten beobachtet, hier ist, wie es gemacht wird:
Thread t = new Thread(new Runnable() {
@Override
public void run() {
int iteration = 0;
long start = 0;
long stop = 0;
while (run) {
CountDownLatch latch = new CountDownLatch(1);
start = System.currentTimeMillis();
for (int i = 0; i < 1001; i++) {
double ran = random(50, 105);
final int c = i;
Platform.runLater(() -> {
series.getData().add(new XYChart.Data<>(c, ran));
if (c == 1000) {
System.out.print("Points: " + series.getData().size());
series.getData().clear();
latch.countDown();
}
});
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
iteration++;
stop = System.currentTimeMillis();
try {
latch.await();
} catch (InterruptedException e) {}
System.out.println(", Iteration : " + iteration + ", elapsed: " + (stop - start) + " [ms]");
}
}
});
Was fehlt uns hier? Warum fällt die Leistung im obigen Beispiel nach ~ 30-45 min ab? Irgendwelche Ideen?
Das obige Stück Code wurde für 8h ausgeführt, jedes Mal, wenn alle Punkte zum Diagramm hinzugefügt wurden, war die "Zeichnungszeit" vergleichbar (zwischen 10100ms und 10350ms).
Sie sagen _Wir haben das gleiche Verhalten beobachtet _ und jedes Mal, wenn alle Punkte zum Diagramm hinzugefügt wurden, war die 'Zeichnungszeit' vergleichbar_. Sollte es keine Verlangsamung geben, so sind die Zeiten nicht alle gleich? Auch nur eine Idee, in einem Aktienmarktdiagramm kann ich Daten entfernen und es wird nie langsamer. Vielleicht 'if (c> 1000) series.getData(). Remove (0,500)'; – brian
Das dachte ich, und deshalb habe ich angefangen, diese Zeit zu messen, was zu meiner Überraschung in jeder Iteration auf vergleichbarem Niveau war. Laufen Sie Ihr Diagramm in einer Schleife? Darf ich fragen mit welchen Parametern? Wie viele Punkte, wie hoch ist die Aktualisierungsrate, für wie lange haben Sie sie ausgeführt? – Stugal
Ich bekomme Daten von einem Sockel, 3hz max, ein paar 1000 Punkte, bis ich alte entferne. Ich benutze es nicht mehr, weil ich mehr Punkte möchte, aber es würde für 8 Stunden arbeiten. Ich verstehe immer noch nicht, ob das Codebeispiel für Sie langsamer wird. Wenn die Zeiten gleich sind, wird es nicht langsamer. – brian