我有一个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;
}
}
答案 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秒/秒。