2010-07-23 1 views
0

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

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

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

Итак, хотя это прекрасно работает, я знаю, что это неправильный способ сделать это. Я думаю, что весь бизнес 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; 
     } 


     } 
+0

В этой записи MSDN есть очень похожая идея: http://msdn.microsoft.com/en-us/library/dd990377.aspx –

+0

К сожалению, это поддерживается в .NET Framework 4. Я настраиваю таргетинг .NET Compact Framework 3.5 –

+0

Конечно, не заметил этого. Однако, чтобы маршалировать что-то обратно на конкретный поток, thead должен опросить очередь или что-то (подумайте, что Message Pump в WinForms). Если вы вернетесь к пользовательскому интерфейсу, это будет возможно. –

ответ

1

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

Is there a BackgroundWorker replacement for .NET Compact Framework 3.5?

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

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

+0

Мне не нужно обновлять интерфейс. Мне просто нужно получить результат GPS для строки, поэтому я могу отправить SMS :) –

+0

Тогда обратный вызов будет прекрасным, но впоследствии, если он не будет виден пользователю, тогда придерживайтесь своей реализации таймера. –

2

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

1

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

+0

Да, я использую демо-версию GPS из CF SDK. Но моя проблема в том, что, если сигнал GPS не может быть сразу получен, так как пользователь находится внутри туннеля или что-то еще?Поэтому я хочу, чтобы он работал, пока он не получил сигнал :) –

+0

Если вы используете это событие, это не проблема. –

+0

Итак, вы имеете в виду, что мне не нужно запрашивать каждые X секунд, фиксирован ли GPS-сигнал, и какое местоположение получено? –