2010-07-23 71 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