青 VB Tips 青

橙 [1]システム時間の精度
何故か?昨晩からVBのプログラムを添削していて気が付いたことがある。
それは、余りに多くの人がシステムタイマの精度について無頓着であるからだ。
プログラマであれハード設計者であれ、要求に対してはコスト影響度を考えつつ最善の道を選ばなければいけない。

実は、自分も心が痛む・・・事を思い出した。

ずっとC++で書いていた自分のオリジナルプログラムではシステムタイマには、マルチメディアタイマを選んで使っていた。
WinAPIの、timeGetTime()関数である。  これが常道!

しかし、昨晩から見ている何人か(8割ぐらい)のソースをみるとWinカーネルのGetTickCountを平然と使っている。
「・・・怒!」「だめだなーあれほど、細かい所はマルチメディア用の関数しか信じるなと指示しているのに・・・」と、ため息をついた時に、厭なことを思い出した。
「そーいえば、前職でMSDさんが書いたプログラムも GetTickCount を使っていたような気がするな・・・」
そうなんです、そ〜いえば、「OSに依って処理時間がかなり違うって言ってたしな・・・」
あの時、僕は自分がいっぱいいぱいだったので余んまり気にしなかったのだが、今朝から本当に気になりだしたのである。
「オリジナルがメカ屋のソフトだから・・・PCやOSの中なんて疑うこと知らないだろうしな・・・」
「そうだよ、絶対 GetTickCount だ。」・・・という事で、お知らせ用にこのページを書いている。(説明書を書くより簡単だからね)
GetTickCount は、1msecと言いながら、5−10msecであることが多く、特にOSに左右される(つまりオーバヘッドを含む関数)。
ま、僕自身この2つのタイマの差を検証したことは無いのだが・・・(あとで検証するけどね)

さて・・・普通のN88Basic(古典のBasic言語の事)を使ってた人はWhileを使いたがるので・・・
大体下記の様なルーチンだと思う。

’誤差が多いタイマルーチンの例
Declare Function GetTickCount Lib "kernel32" () As Long

Public Sub SubSleep(ms As Long)
 Dim tt As Long

 tt = GetTickCount
 Do While GetTickCount - tt > ms
  DoEvents
 Loop
End Sub

Do・・・Loopはきれいにキメタイので

’ 精度が比較的良いハズのマルチメディアタイマを使った例
Declare Function timeGetTime Lib "winmm.dll" () As Long

Public Sub SubWait(ms As Long)
 Dim tt As Long

 tt = timeGetTime()
 Do
  DoEvents
 Loop Until timeGetTime() - tt > ms
End Sub

置き換える場合は、Subの名前を同じにしてサブルーチン内部だけ置き換えれば良い。
この例は、VBの標準モジュール(インクルードファイル)に書く場合を想定している。

Declare Function GetTickCount Lib "kernel32" () As Long
Declare Function timeGetTime Lib "winmm.dll" () As Long
” ”で括られた参照先を見れば一目瞭然、ケンタッキーフライドチキン32号店(日本語読みで同じじゃん)とウィンドウズマルチメディアの精度の差があるのです。
※要するに、GetTickCounは使うの止めようね・・・って事です。

ジョン Home