代码之家  ›  专栏  ›  技术社区  ›  Ranhiru Jude Cooray

帮我用GPS解决这个穿线问题

  •  0
  • Ranhiru Jude Cooray  · 技术社区  · 14 年前

    我有一个GPS等级,显然我用它来获取纬度和经度。

    当GPS状态或位置更改时调用updatedata()。所以我要确保纬度和经度都有效,然后使dataready bool等于true。

    所以我以一种相当n00b的方式使用这段代码,我使用一个计时器(Windows窗体的计时器),每10秒检查一次getgpsco纵坐标(),以查看是否找到有效的位置(getgpsco纵坐标()不是空的),如果不是,则执行代码的其余部分。这是使用,因为它可能需要从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;
            }
    
    
            }
    
    3 回复  |  直到 14 年前
        1
  •  1
  •   Community Nick Dandoulakis    7 年前

    听起来你想用 BackgroundWorker -然而,这在紧凑框架中并不是本机支持的。然而,这也可以解决:

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

    然后,每当您的UI计时器滴答作响时,您就可以调用您的后台工作人员(请确保在收到响应之前暂停您的UI计时器)。

    如果无法使用实现的 背景工作者 从这个问题中,您需要维护一个队列或列表,用户界面和后台都可以看到这个队列或列表。使用普通线程可能意味着注册回调(相当标准,使用 IAsyncResult 想法)然而,这个回调是在一个未知的、任意的线程上运行的——这使得更新用户界面有点棘手。

        2
  •  2
  •   Hans Passant    14 年前

    除非你打算在航天飞机上使用你的应用程序,否则我不能想出一个很好的理由来在这个任务上消耗一个和线程一样昂贵的资源。Windows窗体计时器正常。一定要把时间间隔缩短到,比如说,一秒钟,只要你没有收到一个好的测量结果,这样用户就不用等那么久。一旦你这样做了,增加间隔。尽管我怀疑这会有很大的不同。

        3
  •  1
  •   Henk Holterman    14 年前

    当您安装了CF SDK后,您的HD上可能还安装了GPS演示。它使用了新的GPS中间件驱动程序,如果您不介意的话,它是一个很好的起点。它有一个事件,表明形势发生了变化。当你移动时,它会发射大约1/秒。