一定間隔を待たせるには?

解決


蛍谷  2002-12-22 10:24:20  No: 76733  IP: [192.*.*.*]

VBの初心者です。
一定間隔を待たせる下記のようなルーチンを作成しましたが、間隔が一定にできません。いい方法をご存知ありませんか?

call 時間wait("00:00:03")'3秒待たせる

Private Sub 時間wait(t As String)
    
    Dim StartTime As Date
    Dim KeikaJikan As Date
    
    Timer1.Enabled = True
    
    'スタートの時刻を記憶
    StartTime = Time()
    
    Do Until KeikaJikan >= t
        DoEvents
        'スタートからの差を計算
        KeikaJikan = Time() - StartTime
    Loop
    
    Timer1.Enabled = False
    
End Sub

編集 削除
たかみちえ  URL  2002-12-22 11:02:02  No: 76734  IP: [192.*.*.*]

Timeだと、ミリ秒単位での判断ができないです。
APIのGetTickCountを使いましょう。

編集 削除
Say  2002-12-22 11:38:33  No: 76735  IP: [192.*.*.*]

あなたのコードを尊重するならこう

Option Explicit
Private Declare Function timeGetTime Lib "winmm.dll" () As Long

Private Sub Command1_Click()
    Call 時間wait("00:00:03") '3秒待たせる
End Sub
Private Sub 時間wait(t As String)
    Dim StartTime As Long
    Dim KeikaJikan As Long
    Dim t2 As Double
    
    'ミリ秒に換算
    t2 = CDate(t) * 86400 * 1000
    
    
    'スタートの時刻を記憶
    StartTime = timeGetTime()
    
    Do Until KeikaJikan >= t2
        DoEvents
        'スタートからの差を計算
        KeikaJikan = timeGetTime() - StartTime
        DoEvents
    Loop
End Sub

やや不正確だがTimerを使うなら、たとえばこう
(TimerにはWin95でせいぜい55msec程度の精度しかない。)

Option Explicit
Dim KeikaJikan As Long
Private Sub Command1_Click()
    Call 時間wait("00:00:03") '3秒待たせる
End Sub
Private Sub 時間wait(t As String)
    Dim t2 As Double
    
    '秒に換算
    t2 = CDate(t) * 86400
    KeikaJikan = 0
    Timer1.Interval = 1000
    Timer1.Enabled = True
    
    Do Until KeikaJikan >= t2
        DoEvents
    Loop
    Timer1.Enabled = False
End Sub
Private Sub Timer1_Timer()
    KeikaJikan = KeikaJikan + 1
End Sub

一番簡単なのはこう

Option Explicit
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Sub Command1_Click()
    Dim t2 As Long
   'ミリ秒に換算
    t2 = CDate("00:00:03") * 86400 * 1000
    Sleep t2
End Sub

編集 削除
蛍谷  2002-12-22 13:07:16  No: 76736  IP: [192.*.*.*]

[たかみちえさん]、[Say]さんアドバイスありがとうございます。
[Say]さんのアドバイスでテストしてみたところ正確な待ち時間を作ることができました。ほんとうにありがとうございました。
[たかみちえ]さんにアドバイスしていただいた方法も、ホームページなどで調べて試してみます。
初心者なものですから、簡単なことでも調べるのに時間がかかってしまいます。
どうしてもわからなかったら、また質問させていただきます。
そのときは、簡単なサンプルコードでもおしえてください。
お二人のご親切に感謝します。

編集 削除
Say  2002-12-22 19:28:53  No: 76737  IP: [192.*.*.*]

GetTickCountはtimeGetTimeと使い方はほぼ同じです。

単に、誤差がGetTickCountで5〜12msec,timeGetTimeでほぼ1msecで、
timeGetTimeのほうが精度が高い、と思ってもらって結構です。

編集 削除