0

タイマーイベントを使用して毎秒起動する予定です(時計アプリケーションの場合)。

私は間違っているかもしれませんが、実際のシステム時間との(ごくわずかな)同期の問題があると思います。たとえば、タイマーイベントは、実際のシステム時間のミリ秒が0ではなく500のときに発生する可能性があります(つまり、秒は部分的に「位相がずれている」ことを意味します)。

タイマーイベントをリアルタイムに同期する方法、またはAS3で1秒が刻まれたときに何らかのシステムタイムイベントを発生させる方法はありますか?

また、1000ミリ秒ごとに起動するようにタイマーを設定した場合、それは保証されますか、それともアプリケーションの負荷に基づいてオフセットがありますか?

これらはおそらく無視できる問題ですが、私はただ興味があります。

ありがとう。

4

3 に答える 3

1

日付を使用して現在の時刻を取得できます。本当に必要な場合は、Dateが返すものに合わせてタイマーのジッターを制御することで、タイマーのジッターを制御できます。これが問題になるかどうかはわかりません(アプリケーションが長期間実行され続けない場合は確かですが、それでもエラーがすぐに発生するかどうかはわかりません)。

OSの精度は通常、数ミリ秒以内であり、そのような精度が必要な場合は、別のことを行う必要がある場合があることに注意してください。

于 2010-04-19T16:01:34.387 に答える
0

少なくともタイマーの精度を上げる簡単な方法を考えただけです。タイマー間隔を短くするだけで、誤差の最大マージンが減少します。

したがって、Timer を 1000ms ではなく 100ms ごとに起動するように設定すると、最大誤差が 999ms ではなく 99ms になります。したがって、必要な精度/パフォーマンスに応じて、これらの値を微調整できます。

代わりに、タイマーの頻度を 1 秒のままにする必要がある場合は、非常に短い間隔 (~1ms) で起動する一時的な初期化タイマーを作成できます。次に、各ティックで、現在の時刻と前の時刻を追跡します。時間の秒が変更された場合 (実際のクロックが変更された場合)、その時点でメインのタイマー (1000 ミリ秒) を起動できます。これにより、リアルタイムの秒が変更されたときに 1 秒のタイマーが確実に開始されます (3 桁のミリ秒ではなく 1 桁のミリ秒でエラーが発生します)。

もちろん、時間の変更が検出されてからタイマーが開始されるまでには、多少の遅れがあります。ただし、タイマーを 1 秒に維持しながら、少なくとも精度を向上させることができます。

今週中にこれを試して、また報告します。

于 2010-04-20T18:14:23.650 に答える
0

残念ながら、Timer が同じ速度を維持できるとは限りません。一定期間にわたってドリフトする可能性が非常に高いです (たとえば、1000 ミリ秒に設定した場合、990 ミリ秒ごとに発生する可能性があります。これは非常に小さな違いですが、時間の経過とともに加算されます)。あなたが言ったように、100ミリ秒ごとに発火し、Dateオブジェクトをチェックして、1秒が経過したかどうかを判断する必要があると思います。

于 2010-04-22T23:39:31.030 に答える