Hio.
Ich hab hier eine kleine Frage an euch. Und zwar schreibe ich gerade an einem Programm, das GPS-Daten (genau, das Global Positioning System) bekommt, verarbeitet und anschließend visualisiert. Ich habe dafür eine Klasse GPSSession die eben die aktuelle Session darstellt und in gewissen Zeitabständen (exakt eine Sekunde) neue GPS-Daten bekommt. Des Weiteren habe ich eine Klasse SurveyComponent, die die GPS Session visualisieren soll. SurveyComponent meldet sich bei GPSSession als GPSSessionChangeListener an. Aber nicht nur diese eine graphische Komponente tut das, sonder noch viele mehr, die jeweils komplexe Visualisierungen bieten.
Jetzt zur eigentlichen Frage: Jedes mal wenn GPSSession neue Daten bekommt werden alle Listener davon informiert (das geschieht über eine Schleife mit einem Iterator) und jeder Listener bekommt ein Objekt der Klasse GPSSessionData in der die aktuellen Eigenschaften der GPSSession (wie Position, Richtung, Bewegungsdauer, Geschwindigkeit et cetera) gespeichert sind. SurveyComponent zeichnet z.B. eine Art Karte. Wird es von GPSSession mit neuen Daten versorgt dann wird die Karte neu gezeichnet – und das dauert einen Moment. Wenn SurveyComponent neu zeichnet muss GPSSession ja solange warten, bis SurveyComponent fertig ist und kann dann erst den nächsten Listener updaten – und dadurch wird ja der Programmablauf geblockt. Das dürfte ein ziemlicher Flaschenhals in meinem Programm werden.
Jetzt hab ich mir überlegt wie man das umgehen könnte. Als nächste Lösung schien mir Multithreading, aber das ist auch so ne Sache. Ich hab mir überlegt wie ich das implementieren soll, und hab mir das dann so gedacht:
Listener wird aufgerufen --> neuer Thread wird erzeugt der die Daten verarbeitet --> Daten werden visualisiert. Dabei wird GPSSession ja nicht geblockt da der Thread ja „parallel“ zum Hauptprogramm weiter läuft. Was mach ich aber wenn Thread 1 noch nicht fertig ist und der Listener wird wieder geupdatet? Einen neuen Thread erstellen, der dann auf den alten wartet? Das ist auch nicht gerade die Lösung, irgendwan ist mein Programm mit dem Zeichnen so weit hinterher, so dass das gezeichnete mit der echten physikalischen Situation (ich hoff das sagt man so; ich mein damit einfach das hier und jetzt) nicht mehr übereinstimmt.
Hat vielleicht jemand eine smartere Lösung?
Gruß und Danke an alle die mir antworten
Lutz
Ich hab hier eine kleine Frage an euch. Und zwar schreibe ich gerade an einem Programm, das GPS-Daten (genau, das Global Positioning System) bekommt, verarbeitet und anschließend visualisiert. Ich habe dafür eine Klasse GPSSession die eben die aktuelle Session darstellt und in gewissen Zeitabständen (exakt eine Sekunde) neue GPS-Daten bekommt. Des Weiteren habe ich eine Klasse SurveyComponent, die die GPS Session visualisieren soll. SurveyComponent meldet sich bei GPSSession als GPSSessionChangeListener an. Aber nicht nur diese eine graphische Komponente tut das, sonder noch viele mehr, die jeweils komplexe Visualisierungen bieten.
Jetzt zur eigentlichen Frage: Jedes mal wenn GPSSession neue Daten bekommt werden alle Listener davon informiert (das geschieht über eine Schleife mit einem Iterator) und jeder Listener bekommt ein Objekt der Klasse GPSSessionData in der die aktuellen Eigenschaften der GPSSession (wie Position, Richtung, Bewegungsdauer, Geschwindigkeit et cetera) gespeichert sind. SurveyComponent zeichnet z.B. eine Art Karte. Wird es von GPSSession mit neuen Daten versorgt dann wird die Karte neu gezeichnet – und das dauert einen Moment. Wenn SurveyComponent neu zeichnet muss GPSSession ja solange warten, bis SurveyComponent fertig ist und kann dann erst den nächsten Listener updaten – und dadurch wird ja der Programmablauf geblockt. Das dürfte ein ziemlicher Flaschenhals in meinem Programm werden.
Jetzt hab ich mir überlegt wie man das umgehen könnte. Als nächste Lösung schien mir Multithreading, aber das ist auch so ne Sache. Ich hab mir überlegt wie ich das implementieren soll, und hab mir das dann so gedacht:
Listener wird aufgerufen --> neuer Thread wird erzeugt der die Daten verarbeitet --> Daten werden visualisiert. Dabei wird GPSSession ja nicht geblockt da der Thread ja „parallel“ zum Hauptprogramm weiter läuft. Was mach ich aber wenn Thread 1 noch nicht fertig ist und der Listener wird wieder geupdatet? Einen neuen Thread erstellen, der dann auf den alten wartet? Das ist auch nicht gerade die Lösung, irgendwan ist mein Programm mit dem Zeichnen so weit hinterher, so dass das gezeichnete mit der echten physikalischen Situation (ich hoff das sagt man so; ich mein damit einfach das hier und jetzt) nicht mehr übereinstimmt.
Hat vielleicht jemand eine smartere Lösung?
Gruß und Danke an alle die mir antworten
Lutz