# Permanenter Datenstrom



## Philip1 (23. Nov 2010)

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 (23. Nov 2010)

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 (23. Nov 2010)

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.


----------



## XHelp (23. Nov 2010)

Meinst du wirklich, dass ein EKG mehr Daten produziert, als ein Rechner abarbeiten kann?


----------



## Philip1 (23. Nov 2010)

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 (23. Nov 2010)

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 (24. Nov 2010)

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 (24. Nov 2010)

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 (27. Nov 2010)

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.


----------



## Landei (27. Nov 2010)

Ganz allgemein ist deine Aufgabenstellung ein Producer/Consumer-Problem, und dazu gibt es massenweise Hilfe im Netz. Kurzes Googeln hat z.B. das hier ausgespuckt: Producer ConsumerThreadsJava


----------

