我有一個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;
}
}
在這個MSDN條目中實際上有一個非常類似的想法: http://msdn.microsoft.com/en-us/library/dd990377.aspx – 2010-07-23 08:37:09
不幸的是,這是在.NET Framework 4中支持的。我的目標是.NET Compact Framework 3.5 – 2010-07-23 08:44:00
當然,沒有發現。然而,要將某些東西重新封裝到特定的線程中,則需要輪詢隊列或其他東西(請考慮WinForms中的Message Pump)。如果你要回到用戶界面,這將是可能的。 – 2010-07-23 08:49:22