Помогите мне решить эту проблему с GPS - PullRequest
0 голосов
/ 23 июля 2010

У меня есть класс GPS, который я, очевидно, использую для определения широты и долготы.

UpdateData () вызывается при изменении состояния или местоположения gps. Поэтому я проверяю, что широта и долгота действительны, а затем я делаю DataReady bool равным true.

Таким образом, я использую этот код довольно n00b способом, где я использую Timer (Windows Form) и проверяю getGPSCoordinates () каждые 10 секунд, чтобы увидеть, найдено ли правильное местоположение (getGPSCoordinates () не является нулевым) и если нет , сделайте остальной код. Это используется, поскольку для получения четкого сигнала GPS может потребоваться от 10 секунд до, возможно, даже 1 минуты.

Так что, хотя это работает нормально, я знаю, что это неправильный способ сделать это. Я думаю, что весь бизнес GPS должен вестись в отдельном потоке, и он должен уведомить основной поток, что местоположение изменено, и данные готовы.

Может ли кто-нибудь указать мне правильный способ ведения бизнеса такого рода? Должен ли я использовать IAsyncResult для уведомления основного потока?

bool DataReady = false;

private void UpdateData()
        {

            if (gps.Opened)
            {
                if (position != null)
                {

                    if (position.LatitudeValid)
                    {
                        Latitude =  position.Latitude.ToString();
                    }


                    if (position.LongitudeValid)
                    {
                        Longitude = position.Longitude.ToString();

                    }

                    if (Latitude != null && Longitude != null)
                        DataReady = true;          


                }



            }


 public string getGPSCoordinates()
        {
            if (DataReady)
            {
                return String.Format("http://maps.google.com/maps/api/staticmap?sensor=false&size=500x500&markers=color:red|label:A|{0},{1}&zoom=15&maptype=hybrid", Latitude, Longitude);
            }
            else
                return null;
        }


        }

Ответы [ 3 ]

2 голосов
/ 23 июля 2010

Если вы не планируете использовать свое приложение на космическом шаттле, я не могу найти вескую причину для того, чтобы сжечь ресурс, столь же дорогой, как поток в этой задаче. Таймер Windows Forms в порядке. Сократите интервал, скажем, до секунды, пока вы не получили правильное измерение, чтобы пользователю не пришлось ждать так долго. Как только вы это сделаете, увеличьте интервал. Хотя я сомневаюсь, что это имеет большое значение.

1 голос
/ 23 июля 2010

Когда вы установили CF SDK, у вас, вероятно, также есть демо GPS на вашем HD.Он использует новый драйвер промежуточного программного обеспечения GPS, и если вы не возражаете против этого, это хорошая отправная точка.У него есть событие, которое сигнализирует об изменении ситуации.При движении он будет стрелять примерно на 1 секунду.

1 голос
/ 23 июля 2010

Звучит так, как будто вы хотите использовать BackgroundWorker - однако это не поддерживается изначально в Compact Framework.Опять же, однако, это может быть решено:

Есть ли замена BackgroundWorker для .NET Compact Framework 3.5?

Затем вы можете вызывать фонового работника всякий раз, когда у вас таймер пользовательского интерфейсаотметьте галочки (убедитесь, что таймер пользовательского интерфейса приостановлен, пока не получите ответ).

Если вы не можете использовать реализованный BackgroundWorker из этого вопроса, вам нужно будет поддерживать Очередь или Список, в котором и пользовательский интерфейс, ифон можно увидеть.Использование нормального потока, скорее всего, будет означать регистрацию обратного вызова (довольно стандартно, используя вашу идею IAsyncResult), однако этот обратный вызов выполняется в неизвестном произвольном потоке - это делает обновление вашего пользовательского интерфейса немного сложным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...