Gps verbindung im Hintergrund laufen lassen

tareq

Grünschnabel
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
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. :confused::confused:

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

gruss tareq
 
Hallo

Hat sich erledigt.

Es lag nicht an der Gps Class sondern daran das ich beim Schliessen der Form vorher noch die Methode aus dem Delegaten löschen musste, die in der entsprechenden Form die Ausagben erzeugte.

Code:
 public Standort()
        {
            InitializeComponent();

            GpsStatus.getGpsObject().positionChanged += new PositionChangedEventHandler(Standort_positionChanged);
            updateData = new EventHandler(UpdateData);
        }
        private void Standort_Activated(object sender, EventArgs e)
        {
            this.Name = "Standort";
        }
        private void menuItem1_Click(object sender, EventArgs e)
        {
            //Vor dem Schliessen der Form das Event Standord_position Changed aus dem Delagten entfernen
            GpsStatus.getGpsObject().positionChanged -= new PositionChangedEventHandler(Standort_positionChanged);
            this.Dispose();
        }

        private void menuItem7_Click(object sender, EventArgs e)
        {
            GpsStatus.Close();
        }

        private void Standort_positionChanged(object sender, PositionChangedEventArgs args)
        {
            currentPosition = args.Position;
            Invoke(updateData);

        }

        private void UpdateData(object sender, EventArgs e)
        {
            label1.Text = currentPosition.LongitudeDecimal.ToString();
            //label2.Text = currentPosition.SatelliteCount.ToString();
            showGpsStatus();
        }

...............

Danke für die Hilfe Norbert

Ps

Was ist den ein Singleton?
 
Zurück