0

私は明らかに緯度と経度を取得するために使用する GPS クラスを持っています。

GPS の状態または位置が変更されると、UpdateData() が呼び出されます。したがって、緯度と経度の両方が有効であることを確認してから、DataReady bool を true に等しくします。

したがって、このコードをかなり n00b の方法で使用します。タイマー (Windows フォームのもの) を使用し、10 秒ごとに getGPSCoordinates() をチェックして、有効な場所が見つかったかどうかを確認し (getGPSCoordinates() が null ではない)、そうでない場合は、残りのコード。これは、クリアな gps 信号を取得するのに 10 秒から 1 分程度かかる場合があるため、使用されます。

したがって、これは正常に機能しますが、これが正しい方法ではないことはわかっています。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 フォーム タイマーで問題ありません。ユーザーがそれほど長く待つ必要がないように、適切な測定値を受け取っていない限り、間隔をたとえば 1 秒に減らしてください。完了したら、間隔を増やします。私はそれが大きな違いをもたらすとは思わないが。

于 2010-07-23T08:59:19.647 に答える
1

-を使用したいようですが、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 に答える