C# GPS koordináta, DLL segítségével

C# GPS koordináta, DLL segítségével
2016-11-09T12:44:44+01:00
2016-11-09T14:53:12+01:00
2022-10-15T22:51:23+02:00
Tottika
Sziasztok!
Ismét a segítségeteket kérném. Van egy egyszerű gps koordináta lekérő programom, melyet a GeoCoordinateWatcher segítségével kértem le. Külön DLL fájlon keresztül próbálom elérni ezt a két gps adatot.
A DLL fájl forráskódja:

namespace GPS_DLL { public class GPS_Coordinates { private static double latitude=10; private static double longitude=10; static GeoCoordinateWatcher watcher; GPS_Coordinates(){} public static double Get_Latitude() { watcher = new GeoCoordinateWatcher(); watcher.PositionChanged += new EventHandler<GeoPositionChangedEventArgs<GeoCoordinate>>(Watcher_PositionChanged_latitude); watcher.Start(); return latitude; } public static double Get_Longitude() { watcher = new GeoCoordinateWatcher(); watcher.PositionChanged += new EventHandler<GeoPositionChangedEventArgs<GeoCoordinate>>(Watcher_PositionChanged_longitude); watcher.Start(); return longitude; } private static void Watcher_PositionChanged_longitude(object sender, GeoPositionChangedEventArgs<GeoCoordinate> e) { if (!e.Position.Location.IsUnknown) { longitude = e.Position.Location.Longitude; } watcher.Stop(); } private static void Watcher_PositionChanged_latitude(object sender, GeoPositionChangedEventArgs<GeoCoordinate> e) { if (!e.Position.Location.IsUnknown) { latitude = e.Position.Location.Latitude; } watcher.Stop(); } } }
Az app forráskód részlete ami egyszerűen csak egy gomb lenyomását követően egy textboxban megjeleníti a két adatot:

using GPS_DLL; namespace GPS_Coords { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void coords_BTN1_Click(object sender, EventArgs e) { label_latitude1.Text = GPS_Coordinates.Get_Latitude().ToString(); label_longitude1.Text = GPS_Coordinates.Get_Longitude().ToString(); } } }
A problémám az, hogyha a gombra kattintok először akkor a latitude és a longitude változóm kezdőértékét jeleníti meg (jelen esetben 10, de ha 0 akkor 0 lenne) és ezt követően a 2. kattintásra kapom meg a gps koordinátákat. A textboxban a "waiting" string a kezdőérték. Tehát indításakor normálisan a "waiting" van ott, majd ezt követően ha először kattintok akkor -jelen esetben- 10 és ha másodszor ráklikkelek akkor kapom meg  az általám várt értéket.
Annyi kérdésem lenne hogy, miért?
Előre is köszönöm a segítséget!
Mutasd a teljes hozzászólást!
Annyit azért kipróbálhattál volna, hogy a dll forrását bemásolod az app-ba, és akkor nyilvánvalóvá válna, hogy a jelenségnek nincs köze a dll-séghez.
Az van, hogy a lekérdező függvényed elindít egy watchert, ami majd valamikor a jövőben befejeződik. És addig is visszatér a jelenleg rendelkezésre álló értékkel, ami első alkalommal 10.
Szóval most vagy elfogadod ezt, vagy megvárod a watcher lefutásást helyben (ez tipikusan nem jó ötlet, így készül a homokórázó alkalmazás), vagy megpróbálsz valamit async-await-tal varázsolni (ez kiiktatja a homokórázást, mert a GUI reszponzív maradhat a várakozás ideje alatt is), esetleg a watcher-függvényedbe delegálod a textbox frissítését (ami így azonnal megtörténhet, amint megjött az új koordináta).
Igazából az utóbbi a normális megoldás, és le se kell állítani a watchereket, nyugodtan frissíthetik folyamatosan a koordinátákat.
Mutasd a teljes hozzászólást!

  • Sikerült megoldanom, köszönöm szépen!
    Még annyi kérdésem lenne, hogy ezt így mennyire célszerű használni? Gondolom mivel most nem sok adatról van szó annyira nem vészes.
    DLL-módosult:

    public static async Task Getting_Datas() { await Task.Run(() => { watcher = new GeoCoordinateWatcher(); watcher.PositionChanged += Watcher_PositionChanged; watcher.Start(); }); } private static void Watcher_PositionChanged(object sender, GeoPositionChangedEventArgs<GeoCoordinate> e) { latitude = watcher.Position.Location.Latitude; longitude = watcher.Position.Location.Longitude; } public static double Get_Latitude() { return latitude; } public static double Get_Longitude() { return longitude; } }
    Az appban viszont csak ennyi módosítás történt: 

    public Form1() { InitializeComponent(); GPS_Coordinates.Getting_Datas(); }
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd