0

イベントハンドラーを持つ関数があります。それはgps位置を読み取っていて、位置が読み取られるたびにデータベースにデータを入れます。問題は、1秒間に3つの入力があることです。

たとえば、コードの一部を5秒ごとに処理するようにするにはどうすればよいですか?

timer_tickを実行しようとしましたが、これはイベントハンドラーを使用した関数であるため、実行方法がわかりません。

これが私の関数です:

private void GPS_PositionReceived(string Lat, string Lon)
{
    arrLon = Lon.Split(new char[] { '°', '"' }, StringSplitOptions.RemoveEmptyEntries);
    dblLon = double.Parse(arrLon[0]) + double.Parse(arrLon[1], new System.Globalization.NumberFormatInfo()) / 60;
    deciLon = arrLon[2] == "E" ? dblLon : -dblLon;
    arrLat = Lat.Split(new char[] { '°', '"' }, StringSplitOptions.RemoveEmptyEntries);
    dblLat = double.Parse(arrLat[0]) + double.Parse(arrLat[1], new System.Globalization.NumberFormatInfo()) / 60;
    deciLat = arrLat[2] == "N" ? dblLat : -dblLat;

                ...  //code
}

コードのこの部分を5秒ごとに使用したいと思います。

そうそう、これはイベントハンドラーです:

GPS.PositionReceived += new NmeaInterpreter.PositionReceivedEventHandler(GPS_PositionReceived);
4

3 に答える 3

2

あなたが言おうとしているのは、メソッドが 1 秒間に 3 回呼び出されているということだと思いますが、実際には 5 秒ごとに呼び出されるようにしたいだけですか? 正しい。

その場合は、

DateTime lastDBUpdate

データベースに書き込むたびに、このタイムスタンプを更新します。

次に、次のようなチェックを使用できます

if(DateTime.Now.Subtract(lastDBUpdate).TotalSeconds < 5) { return; }

メソッドの最初の行として。

// Timestamp of last update time
// Default to very old timestamp on init so it always runs once straight away
private DateTime lastDBUpdate = DateTime.MinValue;

private void GPS_PositionReceived(string Lat, string Lon)
{
    // Throttle this method
    if(DateTime.Now.Subtract(lastDBUpdate).TotalSeconds < 5) return;

    // your existing code

    // Update the timestamp 
    lastDBUpdate = DateTime.Now;
}
于 2012-05-17T11:07:58.883 に答える
1

タイマーを使用するだけで、これを確認してください

于 2012-05-17T11:07:07.153 に答える
1

GPS 位置が最後に保持された時間を示す静的/クラスレベルの変数を常に持つことができます。

Public DateTime LastGPSInsert {get; set;}

...

if((DateTime.Now - LastGPSInsert).TotalSeconds > 5)
{
    //Do Insert
    LastGPSInsert = DateTime.Now;
}
//Skip insert
于 2012-05-17T11:08:16.637 に答える