0

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

当 GPS 状态或位置发生变化时调用 UpdateData()。所以我确保纬度和经度都是有效的,然后我使 DataReady 布尔等于 true。

因此,我以相当 n00b 的方式使用此代码,其中我使用计时器(Windows 窗体的)并每 10 秒检查一次 getGPSCoordinates() 以查看是否找到有效位置(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;
        }


        }
4

3 回答 3

2

除非您打算在航天飞机上使用您的应用程序,否则我无法找到一个充分的理由来消耗与此任务的线程一样昂贵的资源。Windows 窗体计时器很好。只要您没有收到良好的测量结果,请务必将时间间隔减少到一秒钟,这样用户就不必等待这么长时间。一旦你这样做,增加间隔。虽然我怀疑它有很大的不同。

于 2010-07-23T08:59:19.647 回答
1

听起来您想使用 a BackgroundWorker- 但是 Compact Framework 本身并不支持它。然而,这可以再次解决:

.NET Compact Framework 3.5 是否有 BackgroundWorker 替代品?

然后,您可以在您的 UI 计时器滴答时调用您的后台工作人员(确保暂停您的 UI 计时器,直到您得到响应)。

如果您无法使用该BackgroundWorker问题中的实现,则需要维护 UI 和背景都可以看到的队列或列表。使用普通线程可能意味着注册回调(相当标准,使用您的IAsyncResult想法)但是此回调在未知的任意线程上运行 - 这使得更新您的 UI 有点挑剔。

于 2010-07-23T08:54:07.620 回答
1

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

于 2010-07-23T09:07:11.033 回答