マルチメディアタイマーの使用
<通常のタイマーより正確な時間を得る>
VBには簡単に使用できる便利なタイマーが付属していますが、お世辞にも正確とは言えません。ゲームやシーケンサーなど正確な割り込みを必要とするソフトにはマルチメディアタイマーが必須です。
宣 言 |
Declare Function timeKillEvent Lib "WINMM" (ByVal uID&) As Long Declare Function timeSetEvent Lib "WINMM" (ByVal uDelay&, ByVal uResolution&, ByVal lpFunction&, ByVal dwUser&, ByVal uFlags&) As Long |
処 理 の 流 れ |
1、timeSetEventでタイマーを開始
↓
2、lpFunctionで指定したプロシージャにメッセージが送られてきたら必要な処理をする
↓
3、タイマーが必要なくなったらtimeKillEventでタイマーを削除
サ ン プ ル プ ロ グ ラ ム |
まずフォームモジュールと標準モジュールを追加し以下のコードを張り付けて実行してください。なお絶対にフォームのXボタンで終了するようにしてください。VB環境内の停止ボタンで終了すると、ページ違反が起こります(処理の流れ(3)が行えない)。
動作確認:Visual Basic 5.0(Visual Basic 4.0では動作しません(AddressOfを使用)),Windows98
フォームモジュール(Form1) |
Option Explicit Dim tmevent As Long Private Sub Form_Load() '第5引数を0にすると最初の一回だけTimerProcが呼び出される tmevent = timeSetEvent(10, 1, AddressOf TimeProc, 0, 1) st = GetTickCount End Sub Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) timeKillEvent tmevent End Sub |
標準モジュール |
Option Explicit Declare Function timeKillEvent Lib "WINMM" (ByVal uID&) As Long Declare Function timeSetEvent Lib "WINMM" (ByVal uDelay&, ByVal uResolution&, ByVal lpFunction&, ByVal dwUser&, ByVal uFlags&) As Long Public Function TimeProc(ByVal IDEvent As Long, ByVal uReserved As Long, ByVal dwUser As Long, ByVal dwReserved1 As Long, ByVal dwReserved2 As Long) As Long 'ここに処理を記述(十ミリ秒に一回呼び出されます) End Function |