Hallo Pumpkin!
Ich hätte fast darauf gewettet, dass du mir antwortest 
Vielen Dank schon mal im Vorraus für deine Mühe!
Mittels einer selbst geschriebenen drawData-Methode zeichne
ich in regelmäßigen Abständen die letzten paar hundert Daten
mittels drawLine(…) in einen Grafikkontext. Diese
drawData-Methode wird durch einen Thread alle 10ms aufgerufen.
10ms = 100x pro Sekunde. Ein normaler TFT schafft mit Mühe
50Hz. Geh mal auf 50 - 100ms, das past auch noch.
Hast Recht, sieht bei 50 immer noch gut aus, bei 100 flackert es aber langsam.
Mit dem Profiler habe ich mir zeigen lassen, wieviele Objekte
allokiert werden, und welche tatsächlich leben. Gerade bei der
drawData-Methode ist die Diskrepanz zwischen allokierten
Objekten/Speicher und wirklich existenten Objekten/belegten
Speicher auffallend groß.
Das hängt von deiner Implementierung ab. Zeig mal.
Hier ein Ausschnitt Code:
storedata erhält seine Daten mittels append() bei jedem SerialPortEvent von der seriellen Schnittstelle. printvector nimmt bei jedem Aufruf der Methode das letzte Datum auf (idealerweise möchte ich später die letzten soundsoviel hundert Daten zeichnen, aber ich wollte es zunächst möglicht einfach probieren). Geschrieben wird das Ganze in TraceBuffer und wird am Ende in einem Panel gezeichnet.
Die for-Schleife soll die letzten x Daten als Linien-Plot zeichnen. Datacounter lasse ich mitzählen, damit nicht noch zusätzlich jedesmal die Größe des Vector-Objekts ermittelt werden muss (so zumindest die Idee). Vom letzten Element werden dann die vorausgegangenen x Werte gezeichnet.
Vector printvector = new Vector();
Graphics TraceBuffer, TracePanel;
Image TraceWnd;
TraceWnd = createImage(jTraceWindow.getWidth(), jTraceWindow.getHeight());
TraceBuffer = TraceWnd.getGraphics();
TracePanel = jTraceWindow.getGraphics();
...
...
public drawTraceWindow() {
TraceBuffer.setColor(...)
TraceBuffer.drawLine(...)
i=0;
try {
printvector.add((Integer)aquisition.storedata.lastElement());
datacounter++;
int pointer = 0;
for(pointer = datacounter-200; pointer 250) i=0;
old = (Integer)printvector.get(pointer);
}
} catch (NoSuchElementException e) {}
....
...
TracePanel.drawImage(TraceWnd, 0, 0, this);
}
Aufgerufen wird diese Funktion durch einen Thread alle 10ms. Grundsätzlich funktioniert das so, allerdings bemerke ich, wie sich die Darstellung mit wachsender Zahl von Elementen verzögert (der durchlaufende Graph erreicht mit der Zeit immer später den Wert, den ich der seriellen Schnittstelle zuführe (ich habe ein Poti, dass ich verstellen kann. Ein Mikrocontroller schiebt den A/D-gewandelten Wert dann rüber).
Am Anfang reagiert die Darstellung sofort, mit der Zeit aber verzögert.
Was mich auch stutzig macht ist folgendes:
Ich möchte den übermittelten Wert in einem Label darstellen. Dazu habe ich in die drawTraceWindow()-Methode folgendes eingefügt:
labelName.setText(Integer.toString(letztesElement));
Die Werte werden korrekt angezeigt, allerdings läuft der Graph im Fenster langsamer, wenn ich den Poti-Wert verändere, und wieder schneller, wenn ich den Wert konstant lasse.
Wie kann ich es erreichen, dass der Wert regelmäßig aktualisiert wird, ohne dass die Graphikdarstellung darunter leidet?
Ist dieses Vorgehen sinnvoll
Wenn man’s sauber programmiert: ja.
Dann vermute ich, es ist nicht sauber programmiert.
Kannst du (und andere natürlich auch) mir auf die Sprünge helfen?
Gruß
Michael