Forums: Developers (Thread #24447)

System Timerの実装 (2009-11-02 22:18 by (del#40607) #46788)

OSのシステムタイマーにLinuxのSIGALRM signalを利用しています。
ところがこのsignalがくせ者で、どう設定してもMain Thread(Cocoa Thread)にのみ通知され、Toppers Threadには通知されません。
POSIXの仕様ではSignalが通知されるのは同一プロセス内の一つのThreadということなので、おそらくCocoaがSIGALRMを独占するしかけなのでしょう。
仕方がないので苦肉の策で、SystemTimer用にThreadをもう一つ起こして、そちらでSIGALRMをToppers Thread向けて発行しています。
config.c の void timer_polling(void)で実装されていて、usleep() と pthread_kill()を使用して、signalを発行します。

本当はこのためだけに threadを作りたくないのですが、いまのところこの方法しか思いついていません。

RE: System Timerの実装 (2009-11-12 00:28 by usami-k #46921)

iPhoneでのタイマの扱いについてこんな記事を見つけたので、参考になるか分かりませんが紹介しておきます。

[iPhone][Metronome] 「Metronome for Professional」をリリースしたので - Ni chicha, ni limona -- paellaの日記 - iPhoneアプリ開発グループ
http://iphone-dev.g.hatena.ne.jp/paella/20091104/1257325344
Reply to #46788

RE: System Timerの実装 (2009-11-13 01:30 by (del#40607) #46937)

情報ありがとうございます。読みました。
確かにこの方法を使えばかなり正確なTimer処理ができます。参考になりました。
ただ、メトロノームならオーディオサンプルを数えるほうが一般的です。iPhoneはそれが実現できるAudio用APIもありますし、このほうが断然正確です。

さてさて、このブログから盗めそうな改良ポイントは
+次のTimer設定を現在の時刻から逆計算で求める
というところかと思います。確かに絶対時刻は正確になります。ただ、これはアプリケーションが求めるタイマー精度で必要かどうかが異なります。
メトロノームをこの方法で作るには絶対必要ですが、その他はどんなアプリがあるのでしょう。
ご要望があれば対応します。ただ、すでにタイマー用pthreadの優先順位は上げていますので、そこそこのタイマー精度はでていると思います。
Reply to #46788