タイムスタンプを使用して、何かが画面に表示されている時間の統計を計算する Cocoa OS X (Leopard 10.5+) エンドユーザー プログラムを作成しています。プログラムが繰り返し NSTimer を使用して実行されている間、時間は定期的に計算されます。 タイムスタンプ、 StartおよびFinish[NSDate date]
をキャプチャするために使用されます。2 つの日付の差を秒単位で計算するのは簡単です。
エンド ユーザーまたは ntp がシステム クロックを変更すると、問題が発生します。 [NSDate date]
システムクロックに依存しているため、変更された場合、Finish変数はStartに対して相対的にずれ、時間の計算が大幅に混乱します。私の質問:
1.システムクロックが途中で変更された場合でも、StartとFinishの間の時間を秒単位で正確に計算するにはどうすればよいですか?
それから何秒経過したかを計算できるように、変更されていない基準時点が必要だと考えています。たとえば、システムの稼働時間です。10.6 には があり- (NSTimeInterval)systemUptime
、 の一部でありNSProcessInfo
、システムのアップタイムを提供します。ただし、私のアプリは 10.5 で動作する必要があるため、これは機能しません。
NSTimer を使用してタイム カウンターを作成しようとしましたが、これは正確ではありません。NSTimer にはいくつかの異なる実行モードがあり、一度に 1 つしか実行できません。NSTimer (デフォルト) はデフォルトの実行モードになります。ユーザーが長時間 UI の操作を開始すると、NSEventTrackingRunLoopModeに入り、デフォルトの実行モードをスキップします。これにより、NSTimer の起動がスキップされ、秒数を正確にカウントできなくなります。
また、別のスレッド (NSRunLoop) を作成して NSTimer 秒カウンターを実行し、UI インタラクションから遠ざけることも考えました。しかし、私はマルチスレッドに非常に慣れていないので、可能であればそれを避けたいと思っています。また、CPU が別のアプリケーション (大きな画像をレンダリングする Photoshop など) によってペグされた場合にこれが正確に機能するかどうかはわかりません。 NSタイマー。
助けていただければ幸いです。:)