2010-07-23 30 views
0

我有一個GPS類,我明顯用於獲取緯度和經度。幫我解決這個與GPS的線程問題

當gps狀態或位置發生更改時,會調用UpdateData()。所以我確保Latitude和Longitude都是有效的,然後讓DataReady布爾值等於true。所以我使用這個代碼在一個相當n00b時尚,我使用一個計時器(Windows窗體的一個),並檢查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 – 2010-07-23 08:37:09

+0

不幸的是,這是在.NET Framework 4中支持的。我的目標是.NET Compact Framework 3.5 – 2010-07-23 08:44:00

+0

當然,沒有發現。然而,要將某些東西重新封裝到特定的線程中,則需要輪詢隊列或其他東西(請考慮WinForms中的Message Pump)。如果你要回到用戶界面,這將是可能的。 – 2010-07-23 08:49:22

回答

1

這聽起來像你想使用BackgroundWorker - 然而,這本身並不在Compact Framework的支持。但是再一次,這可以解決:

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

然後,您可以打電話到您的後臺工作時,您的UI計時器滴答(請務必暫停您的UI計時器,直到你得到的響應)。

如果您無法使用該問題中實施的BackgroundWorker,則需要維護UI和背景可以看到的隊列或列表。使用普通的線程可能意味着註冊回調(相當標準,使用IAsyncResult想法),但是此回調運行在未知的任意線程上 - 這使得更新您的UI有點挑剔。

+0

我不需要更新UI。我只需要獲得GPS結果到一個字符串,所以我可以發送短信:) – 2010-07-23 08:58:20

+0

然後回調將罰款,但隨後,如果它是不可見的用戶然後堅持你的計時器實施。 – 2010-07-23 09:09:52

2

除非你打算在航天飛機上使用你的應用程序,否則我不能想出一個很好的理由來像這個任務那樣耗費一個線程的代價。 Windows窗體計時器沒問題。只要您沒有收到良好的測量結果,請將間隔時間縮短至第二秒,以便用戶不必等待很長時間。一旦你這樣做,增加間隔。雖然我懷疑它有多大的區別。

1

當您安裝了CF SDK時,您可能還會在HD上安裝GPS演示。它使用新的GPS中間件驅動程序,如果你不介意使用它,這是一個很好的起點。它有一個事件表明情況發生了變化。當你移動時它會發射大約1 /秒。

+0

是的,我正在使用CF SDK中的GPS演示。但是我的問題是,如果GPS信號無法立即獲取,因爲用戶在隧道內或什麼東西?所以我希望它運行,直到它得到一個信號:) – 2010-07-23 09:10:37

+0

如果您使用該事件,那就不是問題。 – 2010-07-23 09:27:35

+0

所以,你的意思是我不必每隔X秒就查詢一次GPS信號是否固定並獲得一個位置? – 2010-07-23 09:36:01

相關問題