none
Übertragen von statischen Variablen RRS feed

  • Frage

  • Morgen Leute, ich habe ein Problem und zwar habe ich in meiner C# WPF Projektmappe zwei Projekte. In einem Projekt bekomme ich Koordinaten aus der Hardware ausgelesen die ich in meinem Projekt benötige. Ich initialisiere meine variablen mit = 0 und der übertragene Wert ist auch 0. Wenn ich mit anderen Werten initialisiere bekomme ich auch diese übertragen. Allerdings werden in diesen Variablen die Koordinaten gespeichert die auch richtig in der Console ausgegeben werden. Ich bekomme aber nur die Werte übertragen mit dem ich die variablen initialisiert habe. Hier mal mein code.

     public class Program
        {
            static void Main(string[] args)
            {
                DeviceConfiguration DeviceConfiguration = new DeviceConfiguration();
    
                DeviceConfiguration.ServiceUrl = "http://.........../";
    
                Device Device = new Device(DeviceConfiguration);
    
                Device.StartThread(true);
    
                Device.NewDataAvailableEvent += Device_NewDataAvailableEvent;
    
    
                Console.ReadKey();            
            }
    
            private static double lastPosX = 0;
            private static double lastPosY = 0;
            private static double lastPosZ = 0;
    
            private static void Device_NewDataAvailableEvent(Position.SignedPositions signedPositions)
            {
                try { 
                        if (signedPositions.Positions != null)
                        {
                            if (signedPositions.Positions.Count() > 1)
                            {
                                lastPosX = signedPositions.Positions[1].X;
                                lastPosY = signedPositions.Positions[1].Y;
                                lastPosZ = signedPositions.Positions[1].Z;
    
                                Console.WriteLine(signedPositions.Positions[1].ChannelIndex + " " + lastPosX + " " + lastPosY + " " + lastPosZ);
                            }
                            }
                        }
                catch (Exception)
                {
    
                }
            }
    
            public static Point3D getpositionData()
            {
                Point3D returnPoint = new Point3D(-9999,-9999,-9999);
    
    
                returnPoint.X = lastPosX;
                returnPoint.Y = lastPosY;
                returnPoint.Z = lastPosZ;
    
                return returnPoint;
            }
        }
    In meinem Projekt habe ich den Namespace bei den header hinzugefügt und 
    rufe wie folgt die getpositionData Methode auf.
    
            private void Position()
            {
                    Point3D coordinates = Program.getpositionData();
                    try
                    {
                        if (!Dispatcher.CheckAccess())
                        {
                            textBox21.Dispatcher.BeginInvoke(new Action(() => PositionSar()));
                            textBox22.Dispatcher.BeginInvoke(new Action(() => PositionSar()));
                            textBox23.Dispatcher.BeginInvoke(new Action(() => PositionSar()));
                        }
    
                        else
                        {
                            textBox21.Text = coordinates.X.ToString();
                            textBox22.Text = coordinates.Y.ToString();
                            textBox23.Text = coordinates.Z.ToString();
                        }
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message);
                    }
                }
    Ich bekomme leider nur die 3 initialisierten nullen bei mir in der 
    Oberfläche angezeigt. Jemand eine idee oder einen ansatz??

    Donnerstag, 5. Juli 2018 08:34

Antworten

  • Hallo,

    für mich schaut es so aus, dass dein "Ausleseprogramm" als eigene Programm Instanz läuft. Dein WPF Programm greift dann auf zwar auf den Code, aber nicht auf die Daten zurück. Faktisch hast du zwei unterschiedliche Instanzen deiner Daten, wobei die im WPF Projekt nie mit neuen Daten versorgt wird, deswegen die initialisierten (0).

    Sinnvollerweise baust Du dein Ausleseprogramm in eine Bibliothek um, wobei Du dabei auf die "static" Angaben sowie main - daraus würde der Konstruktor - verzichten und anstatt dessen eine Klasse erstellen solltest. Diese Klasse kannst du in dein WPF Projekt über die Bibliothek einbinden.

    Anstatt einem einzigen Satz von Skalar Variable schiebe die Daten in einer Auflistung, z. B. eine ObservableCollection<Point3> oder, um es threadsicher zu bekommen, eine BlockingCollection<T>. Damit verhinderst du nebenbei Datenverlust und Threading-Probleme.

    Gruß Elmar

    Donnerstag, 5. Juli 2018 10:35
    Beantworter
  • Ich bekomme leider nur die 3 initialisierten nullen bei mir in der

    Oberfläche angezeigt. Jemand eine idee oder einen ansatz??

    So ein Glück, dein Programm arbeitet richtig!

    Vielleicht hast Du aber auch einen entscheidenden Teil in deiner Beschreibung vergessen, nämlich den, der beschreibt wie die Schnittstelle zwischen dem vorhandenem Projekt und deinem Projekt ausschaut.


    - Gruß Florian

    Donnerstag, 5. Juli 2018 14:06

Alle Antworten

  • Hi,

    werden die Variablen denn überhaupt mit den neuen Werten versehen?

    Setz doch mal einen Breakpoint auf die erste Zeile in der Methode "Device_NewDataAvailableEvent" und geh dann Schritt für Schritt durch.

    Insbesondere den leeren catch Block solltest Du aber mal mit sinnvollem Code bestücken und schauen, was dort passiert.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Donnerstag, 5. Juli 2018 09:08
    Moderator
  • Also die Variablen werden innerhalb der Methode mit den neuen Werten versehen und richtig an die console ausgegeben. Aber die übertragenen Werte sind immer die initialisierten.
    Donnerstag, 5. Juli 2018 09:22
  • Hallo,

    für mich schaut es so aus, dass dein "Ausleseprogramm" als eigene Programm Instanz läuft. Dein WPF Programm greift dann auf zwar auf den Code, aber nicht auf die Daten zurück. Faktisch hast du zwei unterschiedliche Instanzen deiner Daten, wobei die im WPF Projekt nie mit neuen Daten versorgt wird, deswegen die initialisierten (0).

    Sinnvollerweise baust Du dein Ausleseprogramm in eine Bibliothek um, wobei Du dabei auf die "static" Angaben sowie main - daraus würde der Konstruktor - verzichten und anstatt dessen eine Klasse erstellen solltest. Diese Klasse kannst du in dein WPF Projekt über die Bibliothek einbinden.

    Anstatt einem einzigen Satz von Skalar Variable schiebe die Daten in einer Auflistung, z. B. eine ObservableCollection<Point3> oder, um es threadsicher zu bekommen, eine BlockingCollection<T>. Damit verhinderst du nebenbei Datenverlust und Threading-Probleme.

    Gruß Elmar

    Donnerstag, 5. Juli 2018 10:35
    Beantworter
  • Ich bekomme leider nur die 3 initialisierten nullen bei mir in der

    Oberfläche angezeigt. Jemand eine idee oder einen ansatz??

    So ein Glück, dein Programm arbeitet richtig!

    Vielleicht hast Du aber auch einen entscheidenden Teil in deiner Beschreibung vergessen, nämlich den, der beschreibt wie die Schnittstelle zwischen dem vorhandenem Projekt und deinem Projekt ausschaut.


    - Gruß Florian

    Donnerstag, 5. Juli 2018 14:06