OS2/API/タイマ
API
OS/2 のタイマ API:
- インターバルタイマ - DosStartTimer/DosStopTimer
- ワンショットタイマ - DosAsyncTimer
(ほぼ)一定の時間間隔で/時間後に一度だけ、イベントセマフォにポストする。イベントセマフォは共有(DC_SEM_SHARED)でないといけない。
ユーザー関数にコールバックする機能はないので、必要な場合は、たとえば別スレッドで DosWaitEventSem 後に呼び出すとかするしかない。でもどうせスレッドがいるならその中で DosSleep ぶん回してればいいんじゃね? みたいなことになりかねない罠。
分解能
タイマAPI や DosSleep の分解能はかなり粗い。通常は 32ms 単位。つまり DosSleep(1) を100回まわすと 0.1 秒どころか3〜4秒かかる。
ただし、実行スレッドの優先度がタイムクリティカルの場合は 8ms の精度を得ることができる。さらに V4.50 レベルの OS/2 ならカーネルと CLOCK01.SYS をアップデートして CONFIG.SYS 中に CLOCKSCALE=4 を書けば 1ms 単位の分解能が得られるようだ(この場合も、タイムクリティカルスレッド以外では依然として 32ms のようだ…orz)。
とりあえず添付:tsttick_20080903.zip
ひとつ気づいたんですが、タイマ API や DosSleep の発行時だけタイムクリティカルにしておけば一応いけるのか?
あとなんかドライバ経由の高精度タイマがあったよなあ。なんだっけ。timer0? 実はよく知らない…。
参考
- High Resolution Timing under OS/2
- SDL for OS/2 のソース:SDL_systimer.c