1

絶対値は次のコードをEnvironment.TickCountラップから保護しますか?

If Math.Abs((Environment.TickCount And Int32.MaxValue) - StartTime) >= Interval Then
    StartTime = Environment.TickCount And Int32.MaxValue ' set up next interval
    ...
    ...
    ...
End If

Environment.TickCountラップアラウンドを防ぐより良い方法はありますか?

(これは .NET 1.1 です。)

編集- Microsoft Environment.TickCountヘルプに従ってコードを修正しました。

4

8 に答える 8

8

測定する期間が 24.8 日を超えない限り、ラッピングの問題を回避するのは簡単です (それ以上は符号付き整数で表すことはできません)。C# の場合:

int start = Environment.TickCount;
DoLongRunningOperation();
int elapsedTime = Environment.TickCount - start;

私は VB.NET にあまり詳しくありませんが、チェックされていない数学を使用している限り、これは機能し、ラップについて心配する必要はありません。

たとえば、Environment.TickCount が 2147483600 から -2147483596 にラップする場合、それは問題ではありません。100 ミリ秒であるそれらの差を計算することもできます。

于 2009-11-29T18:41:37.007 に答える
2

ストップウォッチを使用するだけです:

Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
Thread.Sleep(10000);
stopWatch.Stop();
// Get the elapsed time as a TimeSpan value.
TimeSpan ts = stopWatch.Elapsed;

int32 ではなく int64 を返します。さらに、わかりやすいです。

于 2009-11-29T18:47:05.297 に答える
1

あなたが何を達成しようとしているのかわかりません。特定の間隔が発生したかどうかを検出し、発生した場合は特定のロジックを実行しようとしているようです。

この目的で Environment.TickCount を使用する場合、これはあなたに終わりのない苦痛を引き起こす可能性があります。ご指摘のとおり、この値は 25 日ごとにラップする可能性があります。これを防ぐ方法はありません。そうしようとすると、コードにバグが発生することになります。

代わりに、次のことをしてみませんか。

  • イベントの内部および実行に実際のタイマーを使用する
  • StartTime を DateTime (または VB では単に Date) 値として保存します。この値の範囲ははるかに長くなります。この値がラップアラウンドするのに十分な時間、アプリが実行される可能性はほとんどありません (OS は、それよりずっと前に再起動が必要になります:))。
于 2009-04-16T14:52:15.890 に答える
0

精度に応じて、次を使用してみませんか。

DateTime.Now.Ticks

このティックのラッピングはありません。

于 2009-04-16T14:57:13.227 に答える
0

あなたのコードはおそらく機能しません。アプリが Vista またはそれ以降の Windows バージョンで実行される場合は、GetTickCount64を使用できますが、.NET 1.1 を使用していることを考えると、そうではないと思います。

コードは間隔と等しいかどうかをチェックしないでください。これはうまくいかない可能性があります。Int64 を使用してティックを保存し、最後に処理されたティックを変数に保存します。この変数が新しいティック値よりも大きい場合は、ラップがあり、合計ティック ベース (Int64) をインクリメントする必要があります。 12日ごとに1回以上チェックしてください... ;)

于 2009-04-16T15:01:36.757 に答える