|
おばんです。
OnTimeやったら、こんな感じでいけるとは思うねんけど・・・
(6秒ごとにイミディエイトに6回(最初の1回とループで5回)書き出す処理)
Sub TestOnTime()
Const LOOP_COUNT = 5 'ループの回数
Static i As Long
Main i
i = i + 1
If i <= LOOP_COUNT Then
Application.OnTime Now + TimeValue("00:00:06"), "TestOnTime"
Else
i = 0
End If
End Sub
Sub Main(ByVal Counter As Long) 'メイン処理
Debug.Print Counter, Timer
DoEvents
End Sub
せやけど、ひょっとしたら
>30秒ごとの測定は30.2秒や29.9秒など一秒以下の誤差なら構いません。
>ですが30.2秒が積み重なって最終的に60000秒の計測が60145秒など
>最終的にずれると困るわけであります。
↑これがネックになるかも知れまへんなー
開始時刻を変数にキープしておいて、ループの中でチェックっていう
方法のほうが確実なんとちゃうかな?
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Declare Function GetTickCount Lib "kernel32" () As Long
Sub TestSleep()
Const LOOP_COUNT = 5 'ループの回数
Const INTERVAL = 6000 'メイン処理実行間隔(ミリ秒)
Const EXEC_TIME = 1000 'メイン処理想定処理時間(ミリ秒)
Dim StartTime As Long 'メイン処理開始時刻
Dim NextTime As Long '次のメイン処理実行時刻
Dim i As Long
StartTime = GetTickCount()
Main i
For i = 1 To LOOP_COUNT
NextTime = INTERVAL * i
Do
If GetTickCount() - StartTime > NextTime Then Exit Do
Sleep 10
Loop
Main i
If i = LOOP_COUNT Then Exit For
Sleep (INTERVAL - EXEC_TIME)
Next
End Sub
Sub Main(ByVal Counter As Long) 'メイン処理
Debug.Print Counter, Timer
DoEvents
End Sub
60000秒(16時間以上)も待ってられへんから、どっちの誤差が大きいか
どうかはチェックできまへんが・・・
ま、短い時間やったらOnTimeでも問題ないみたいやね。
っていうか、両方とも16時間以上もちゃんと動き続けるかどうかは
保証できまへん(^^;;
本来はEXEを作るべきやろね。
※CPUの使用率は未確認です。処理の中断は考慮してまへん。
試してみてな。
ほな。
|
|