ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

MacOS X開発者コミュのミリ秒単位のタイムスタンプを得る方法

  • mixiチェック
  • このエントリーをはてなブックマークに追加
とほほな状態のMac OS Xプログラミング初心者です.
Objective-CでCocoaアプリケーション作っています.
そのアプリケーション中で,マウスが動くたびに仕事をさせているのですが,そのときに,ミリ秒とか数十ミリ秒単位でタイムスタンプを付けたいと思っています(マウスの移動速度を計測するみたいなことをしたいのです).差を知りたいだけなのでマシンorプログラム起動時からの時刻でかまわないです.WindowsだとGetTickCount()なんてのがあるらしいですし,JavaだとSystem.currentTimeMillis()ってのが使えるかと思います.time.hなら呼べると思うのですが,これだと秒単位です.CやObjective-Cからアクセスできる手頃な関数ごぞんじでしたらよろしくお願いします.

コメント(12)

自己解決しました.
#include <Carbon/Carbon.h>
すると,
UInt32 TickCount ();
ってのが使えて,起動時からの1/60秒単位の時間がわかるようです.いざとなったらやっぱりCarbon.
初めまして。

[[NSDate date] timeIntervalSince1970]で得られるNSTimeIntervalの値は実質的にはdoubleで、小数点より上は秒、小数点以下はミリ秒単位になっています。差分だけならこれで問題なく取れると思うのですがいかがでしょうか。逆に起動時からの時間は分かりませんが、Carbon を使わなくても済むことも多いです。
Cocoaオンリーでやるならば、NSDateクラスのクラスメソッドtimeIntervalSinceReferenceDateを使って、2001年1月1日(GMT)からの経過時間をNSTimeInterval型で得るという感じになると思います。

NSTimeInterval型の実体はdoubleで、「Always in seconds; yields submillisecond precision over a range of 10,000 years.」とのことなので、ミリ秒単位の時間も取れるはずです。
動作確認はしましたが、自信がありません。良い解であるか分かりません。
以下のコードでリアルタイムクロックからナノ秒までの値が取得できるようです。

#include <mach/mach.h>

int main (int argc, const char * argv[]) {
clock_serv_t clock_serv;
mach_timespec_t cur_time;
host_get_clock_service(mach_host_self(), REALTIME_CLOCK, &clock_serv);
clock_get_time(clock_serv, &cur_time);
printf("[%u %d]", cur_time.tv_sec, cur_time.tv_nsec);
return 0;
}
gettimeofday()が使えると思います。
manでご確認ください。
皆さん,ご親切に教えていただきありがとうございます!
試してみます.
試してみました.
gettimeofday, timeIntervalSince1970, timeIntervalSince1970
の順にprintfしてみたら,こんな感じ
983117マイクロ秒 983142マイクロ秒 983191マイクロ秒
で,それらしい値でした.
Cocoaのやり方教えていただきありがとうございました>沼田様,りゅう様.
で結局一番汎用的なgettimeofdayを使う事にします(将来Linuxで使うかもしれないし).ありがとうございます>村上様.

実は,TickCount()で得られる1/60秒単位の時刻では分解能が荒すぎて,マウス移動イベントに同じタイムスタンプがふられてしまう場合があることがわかりました.ということで,教えていただき本当に助かりました.
もう遅いかもしれませんが、、、一応ほかの選択肢もご紹介しておきます。
私は精度の高いタイムスタンプが必要なときにはDriverServices(CoreServices.frameworkの中のCarbonCore.frameworkの中)のUpTime()を日常的に利用しています。
これは名前からも想像できるようにドライバレベルの開発などにも使用される精度の高いものです。(って、通常のアプリケーションプログラミングではここまでの精度は必要ないとは思いますが。。。)
ちょっとだけ、補足を。
Mac OS Xでは用意されていないようですが、OSによってはhrtimeという、高精度の時間が取得できるものもあるようです。
同じ名前の関数でも、OSによっては、実装は色々だと思います。
単位が細かくても、正確かどうかは良くわかりません。
また、使い方によったは、呼び出しコストを気にする必要があるかもしれません。
さえき様,村上様,ありがとうございます.今後の参考にさせていただきます.

ちなみに,>>7番の,

>gettimeofday, timeIntervalSince1970, timeIntervalSince1970
の順に

というには,

>gettimeofday, timeIntervalSince1970, timeIntervalSinceReferenceDate
の順に

の間違いでした,失礼しました.
NSGregorianDateのmicrosecondOfSecond()は重いっすか?

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

MacOS X開発者 更新情報

MacOS X開発者のメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング