APIのtimeSetEvent関数を使用し、一定時間待ち合わせるという処理を作ったのですが、EXEで実行した場合に無限ループになってしまいます。
VBから実行する場合はちゃんとできるのですが…
↓↓↓こんな感じのソースです↓↓↓
Private Sub WaitTime(Interval As Long)
Dim lngResult As Long
'秒→ミリ秒
Interval = Interval * 1000
' タイマイベントを開始
gTimerId = _
timeSetEvent( _
Interval, _
0, _
AddressOf TimeProc, _
0, _
TIME_PERIODIC)
'タイマイベントが発生するまでWAIT(空ループ)
Do While (gTimerId <> 0)
→→ここで無限ループになってしまいます。
でも、ここに、デバッグ用の処理を入れたら、
EXE実行でも無限ループにはなりませんでした
’デバッグ用に入れてみた処理
FRM_P21G1010.Text1 = gTimerId
FRM_P21G1010.Refresh
Loop
lngResult = timeKillEvent(gTimerId)
End Sub
'Interval分時間が経過し、タイマイベントが発生したら、ココが実行される
Function TimeProc _
(ByVal uID As Long, _
ByVal uMsg As Long, _
ByVal dwUser As Long, _
ByVal dw1 As Long, _
ByVal dw2 As Long) As Long
gTimerId = 0
End Function
あ、すいません。ちなみに開発環境はVB6です。
そして、いまデバッグしてみたところ、TIMERイベント自体が発生していないようです。
どなたかよろしくお願いしますm(__)m
本題とはずれるかもしれませんが。
> lngResult = timeKillEvent(gTimerId)
この部分ですが、Whileを抜ける時にgTimerIdの値は0のはずですよね?
ちゃんと timeSetEvent()で取得した値を使わないと駄目な気がします。
ありがとうございます。
無限ループは、空ループの中に「DOEVENTS」
を記述することで解決できました。
でも今度は、イベント間隔がたまにおかしい… っていうのがありまして。
たぶんarさんのご指摘のとこが原因じゃないかと思います。やってみます〜☆
第2引数も『システム・オーバーヘッドを縮小するために
適切な値を使用するべきです』とかヘルプに書いてあるから
0(ms)より1(ms)くらいの方がいいかもね(?)
おそくなりました。
いろいろとやってみて、解決しました。
ありがとうございます。
いろいろやった内容を書いておくと他の人が見たとき
役に立つと思いますのでよろしくおねがいします。
ツイート | ![]() |