Permanenter Datenstrom

Philip1

Mitglied
Hello @ all!

Ich würde gerne wissen wie ich mit einem permanenten Datenstrom umgehen soll?!

Kurzes Szenario:
Ich habe ein Bluetoothgerät A, das ständig Daten schickt, ohne Unterbrechung. Das zweite Bluetoothgerät B soll nun die Daten empfangen und verarbeiten.

Status:
Die Connection steht, ich empfange auch Daten über einen InputStream, und mit in.read() kann ich sie in einen byte array schreiben und verarbeiten.

Meine Frage: Was passiert mit den Daten die A schickt, während B die zuvor empfangenen Daten gerade verarbeitet?!
Meine Vermutung ist, dass die Klasse InputStream dass irgendwie puffert, jedoch hätte (hat) das ungute Folgen -> Die Verarbeitung ist langsamer als die Übertragungsrate, dadurch wird der Puffer immer größer, und nach einer gewissen Zeit schmiert mir die Applikation ab...

Gibt es da eine generelle Lösung wie man mit solch einem Fall umgeht??? :bahnhof:


Vielen Dank im Voraus für eure Vorschläge!
 

XHelp

Top Contributor
Wenn der Puffer voll ist, kannst du ja von Gerät A "warte mal" schicken. Wenn du ihn abgearbeitet hast, dann kannst du "mach weiter" schicken.
 

Philip1

Mitglied
Ja, das ist leider nicht so einfach, da ich auf Gerät A keinen Einfluss habe!

Um sich das besser vorzustellen:
Gerät A ist ein EKG-Gerät, dass ein EKG am Patienten abnimmt, und per bluetooth die EKG-Daten sendet. Ich möchte diese EKG-Daten auffangen (mit Gerät B) und darstellen.
 

Philip1

Mitglied
Es sind genau gesagt 200 Werte/Sekunde.
Das Problem ist ja nicht diese Zahl, sondern die Verarbeitung die relativ kompliziert ist. Hinzu kommt das Zeichnen (soll Live sein) was wiederum Zeit benötigt.
Alles zusammen benötigt einfach länger als die Übertragung der Daten.

Aber deinen Fragen nach zu Urteilen, ist die einzige Möglichkeit dieses Problem zu lösen den Code der Verarbeitung zu optimieren... sehe ich das richtig? (...hmm...das wird nicht ganz einfach ;) )
 

XHelp

Top Contributor
Du hast eigentlich deine Frage selber beantwortet: du hast Dateninput, welches du nicht steuern kannst. Da kannst du eben nicht viel machen.
Du kannst es so machen, dass ein Teil die Daten nur sammelt und ein anderer Teil die Daten bei bedarf auswertet, aber es läuft auf noch einen Puffer hinaus.
Beim Zeichnen sieht die Sache etwas anders aus: du wirst ja nicht 200 mal die Sekunde neuzeichnen...
 

Empire Phoenix

Top Contributor
Ich würde die daten erst einmal roh in einer datenbank oder i ram speichern, und dann die verarbeitung in einem 2 ten thread entweder nur mit jedem x ten wert machen, oder gleichzeitig aber langsamer als echtzeit (Da wir bei Ekg ja von einem endlichen Prozess ausgehen hat man das irgetwann alles aufgeholt) (Oder beides, eines als Live sicht das andere zur Detailauswertung)
 

Philip1

Mitglied
Alles klar, vielen Dank für eure Hilfe!

Im Moment habe ich es jetzt so, dass ich nur jeden 4. Werte nehme, diesen Wert einer Zeichenserie hinzufüge und alle paar Sekunden ein repaint in einem eigenen Thread mache. (Die Verarbeitung der Daten ist ebenfalls in einem eigenen Thread)

Funktioniert zwar noch nicht einwandfrei (Die App schmiert immer noch ab nach einer willkürlichen Zeit), aber es ist zumindest mal präsentationsfähig. :bae:
 

Empire Phoenix

Top Contributor
Benutz mall was anderes als eine Zeichenkette, such dir mal in den Collections eine synchronisierte List oder so raus, die sollte das abschmieren evtl beheben. Denke zum indest das die kommen, wenn der eine gerade mit den selben bytes arbeitetet, die der andere modifiziert.
 

Ähnliche Java Themen


Oben