Il GPS sample c# che realizza un wrapper managed attorno al GPS intermediate driver del windows mobile contiene alcuni seri errori, due in particolare.
- un crash tipo null-reference quando si chiama la funzione GetSatellitesInView
- un deadlock in chiusura del GPS generata da un lock(this) nella classe base e l'utilizzo di un Invoke sincrono nell'update dell'interfaccia utente.
Il secondo punto, più compesso, è rimediato in maniera sommaria cambiando gli Invoke() che causavano i deadlock, sostituendoli con dei BeginInvoke(). Da microsoft ci sarebbe aspettato almeno una revisione del codice, con questa pezza abbiamo risolto un baco agendo sugli effetti.
Bisogna usare BeginInvoke in tutte le notifiche che provengono dal thread GPS che notifica la lettura di nuove coordinate GPS verso la UI.
Il deadlock può scattare quando dall'interfaccia utente impartisco il comando di chiusura del GPS, tramite, per esempio, la pressione del tasto "chiudi". Se nel frattempo il gps rileva nuove coordinate il thread separato in ascolto sul driver GPS (che detiene il lock, tramite il comando lock(this)) deve notificarlo all'interfaccia utente sincronizzandosi con un Invoke al thread dell'UI; thread della ui che però è bloccato a sua volta nel comando di chiusura (che rimane in attesa dell'acquisizione del lock, anche lui tramite il lock(this)).
Commenti