帮我解决GPS的线程问题

时间:2010-07-23 08:19:16

标签: c# multithreading compact-framework gps iasyncresult

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

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

所以我以相当n00b的方式使用这个代码,我使用Timer(Windows Form的一个)并每10秒检查一次getGPSCoordinates()以查看是否找到了有效位置(getGPSCoordinates()不为null)如果没有,做其余的代码。使用它,因为可能需要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 个答案:

答案 0 :(得分:2)

除非你打算在航天飞机上使用你的应用程序,否则我无法想出一个像这个任务上的线程一样昂贵的资源。 Windows窗体计时器很好。只要您没有收到良好的测量结果,请将Interval减少到一秒钟,这样用户就不必等待这么久。完成后,增加间隔。虽然我怀疑它有多大区别。

答案 1 :(得分:1)

听起来您想使用BackgroundWorker - 但Compact Framework本身不支持此功能。但是,这可以解决:

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

然后,只要您的UI计时器打勾,您就可以打电话给您的后台工作人员(确保暂停您的UI计时器直到您收到回复)。

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

答案 2 :(得分:1)

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