Hallo
Wie der Titel schon sagt würde ich gerne eine Gps verbindung im Hintergrund laufen lassen.
Mit folgendem Code öffne ich die Gps Verbindung.
Die Gps Class
Jetzt würde ich gerne beim Start des Programmes einmalig ein Gps.cs Objekt erstellen das über alle Forms hinweg existiert.
Beim öffnen einer neuen Form oder dem Schliessen einer Form sollte das Gps Objekt dann immer präsent sein, um darauf zugreifen zu können.
Ich habe als erstes versucht das Gps Objekt an jede Form einfach weiterzugeben.
Das geht soweit auch. Schliesse ich die Form aber mit zb "Dispose" oder "Close" dann wird das Objekt zwar in der aufrufenden Form nicht gelöscht, jedoch kann ich nicht mehr auf die Daten zugreifen. Ich vermute das der Thread in der Gps Class nicht mehr weiterläuft.

Ich hoffe ich hab mich verständlich ausgedrückt.
gruss tareq
Wie der Titel schon sagt würde ich gerne eine Gps verbindung im Hintergrund laufen lassen.
Mit folgendem Code öffne ich die Gps Verbindung.
Die Gps Class
Code:
using System;
using System.Collections.Generic;
using System.Text;
using OpenNETCF.WindowsCE.Notification;
using OpenNETCF.WindowsMobile;
using System.IO.Ports;
using System.Threading;
using System.IO;
using System.Windows.Forms;
namespace VisumGps
{
public delegate void PositionChangedEventHandler(object sender,PositionChangedEventArgs args);
public class Gps
{
/// <summary>
/// Initializes a new instance of the <see cref="Gps"/> class.
/// </summary>
public Gps()
{
gpsPort = new SerialPort();
}
/// <summary>
/// Opens this instance.
/// </summary>
/// <returns></returns>
public bool Open()
{
if (!gpsPort.IsOpen && nmeaData == null)
{
try
{
gpsSettings.LoadGpsSettings();
gpsPort.PortName = gpsSettings.portName;
gpsPort.BaudRate = gpsSettings.baudRate;
gpsPort.Open();
}
catch
{
//If no Gps Port exists, run FakeGps
// only for the emulator
nmeaData = new StreamReader(@"/Program Files/VISum/gpsdaten.txt");
gpsFake = true;
}
worker = new WorkerThread();
worker.StartThread();
CreateGpsEventThread();
return true;
}
return true;
}
/// <summary>
/// Closes this instance.
/// </summary>
public void Close()
{
if (gpsPort.IsOpen)
{
worker.StopRequest = true;
gpsPort.Close();
gpsPort.Dispose();
}
if (nmeaData != null)
{
worker.StopRequest = true;
nmeaData.Close();
}
}
/// <summary>
/// Gets a value indicating whether this instance is open.
/// </summary>
/// <value><c>true</c> if this instance is open; otherwise, <c>false</c>.</value>
public bool isOpen
{
get { return gpsPort.IsOpen; }
}
/// <summary>
/// Sets and Gets the position.
/// </summary>
/// <returns></returns>
public GpsPosition GetPosition()
{
gpsPosition.Update(gpsData);
return gpsPosition;
}
/// <summary>
/// Occurs when [position changed].
/// </summary>
public event PositionChangedEventHandler positionChanged;
/// <summary>
/// Creates the GPS event thread.
/// </summary>
private void CreateGpsEventThread()
{
if (gpsEventThread == null)
{
ThreadStart readGpsData = new ThreadStart(ReadGpsData);
gpsEventThread = new Thread(readGpsData);
gpsEventThread.Start();
}
}
/// <summary>
/// Reads the GPS data.
/// </summary>
public void ReadGpsData()
{
while (!worker.StopRequest)
{
try
{
if (gpsFake)
{
gpsData = nmeaData.ReadLine();
Thread.Sleep(300);
}
else
{
gpsData = gpsPort.ReadLine();
}
if (gpsData.StartsWith("$GPGGA") || gpsData.StartsWith("$GPRMC"))
{
if (positionChanged != null)
{
positionChanged(this, new PositionChangedEventArgs(GetPosition()));
}
}
}
catch
{
// Wait and try it again
Thread.Sleep(100);
}
}
gpsEventThread = null;
}
#region variablen
private SerialPort gpsPort;
protected Thread gpsEventThread = null;
protected WorkerThread worker = null;
string gpsData = "";
GpsPosition gpsPosition = new GpsPosition();
GpsSettings gpsSettings = new GpsSettings();
bool gpsFake = false;
TextReader nmeaData = null;
#endregion
}
}
Jetzt würde ich gerne beim Start des Programmes einmalig ein Gps.cs Objekt erstellen das über alle Forms hinweg existiert.
Beim öffnen einer neuen Form oder dem Schliessen einer Form sollte das Gps Objekt dann immer präsent sein, um darauf zugreifen zu können.
Ich habe als erstes versucht das Gps Objekt an jede Form einfach weiterzugeben.
Das geht soweit auch. Schliesse ich die Form aber mit zb "Dispose" oder "Close" dann wird das Objekt zwar in der aufrufenden Form nicht gelöscht, jedoch kann ich nicht mehr auf die Daten zugreifen. Ich vermute das der Thread in der Gps Class nicht mehr weiterläuft.


Ich hoffe ich hab mich verständlich ausgedrückt.
gruss tareq