C # показать местоположение GPS на карте - PullRequest
3 голосов
/ 30 июня 2010

Я работаю в приложении для Windows Mobile и хочу показать свое текущее местоположение с помощью карт Google. Я использовал Местоположение DLL из образцов. Как вы видите ниже в моем коде, я вызываю правильный метод для обновления карты в событии gps_Locationchanged , где я использую метод Invoke для обновления изображения pictureboxe. Проблема в том, что я не могу использовать главное меню и контекстное меню приложения, когда захочу. Как будто они замирают, пока новая карта не закончит загрузку. Есть ли другой способ сделать это в другом потоке, чтобы их можно было использовать в любое время?

void gps_LocationChanged(object sender, LocationChangedEventArgs args)
{
    if (args.Position.LatitudeValid && args.Position.LongitudeValid)
    {

       pictureBox1.Invoke((UpdateMap)delegate()
         {
             center.Latitude = args.Position.Latitude;
             center.Longitude = args.Position.Longitude;
             LatLongToPixel(center);
             image_request2(args.Position.Latitude, args.Position.Longitude);

         });
    }
}

Ответы [ 2 ]

3 голосов
/ 30 июня 2010

Может быть, что-то в этом роде?

    bool m_fetching;

    void gps_LocationChanged(object sender, LocationChangedEventArgs args)
    {
        if (m_fetching) return;

        if (args.Position.LatitudeValid && args.Position.LongitudeValid)
        {
            ThreadPool.QueueUserWorkItem(UpdateProc, args);
        }
    }

    private void UpdateProc(object state)
    {
        m_fetching = true;

        LocationChangedEventArgs args = (LocationChangedEventArgs)state;
        try
        {
            // do this async
            var image = image_request2(args.Position.Latitude, args.Position.Longitude);

            // now that we have the image, do a synchronous call in the UI
            pictureBox1.Invoke((UpdateMap)delegate()
            {
                center.Latitude = args.Position.Latitude;
                center.Longitude = args.Position.Longitude;
                LatLongToPixel(center);
                image;
            });
        }
        finally
        {
            m_fetching = false;
        }
    }
3 голосов
/ 30 июня 2010

Трудно сказать наверняка, но похоже, что метод image_request2 (), который (я предполагаю) получает реальное изображение с сервера, является проблемой. Если бы вы запустили этот метод в рабочем потоке и предоставили простой метод обратного вызова, который бы рисовал изображение на экране после его полной загрузки, это оставило бы ваш поток пользовательского интерфейса открытым для получения событий от пользователя.

...