- PR -

TimeSetEventについて

1
投稿者投稿内容
T3HKYM
会議室デビュー日: 2004/01/29
投稿数: 15
投稿日時: 2007-04-12 11:08
WindowsXPとVB.Net2005にてアプリケーションの開発をしております。
TimeSetEventを使用して20msecのタイマー処理を作成していますが、タイマー自体は正常に動作しているのですが、突然【CallBackOnCollectedDelegate】のエラーメッセージが表示され停止してしまいます。VB6とTimeSetEventは不可とのHPを見たように思いますが、.Net2005では同なのでしょうか。アドバ イス頂ければと思い、投稿致します。
又、参考までにソースの一部を公開いたします。
' <<<< 高精度タイマ >>>>
Public Delegate Sub TimerProcDelegate(ByVal uID As Integer, ByVal uMsg As Integer, ByVal dwUser As Integer, ByVal dw1 As Integer, ByVal dw2 As Integer)

Public Declare Function timeBeginPeriod Lib "winmm.dll" (ByVal uPeriod As Integer) As Integer
Public Declare Function timeEndPeriod Lib "winmm.dll" (ByVal uPeriod As Integer) As Integer
Public Declare Function timeSetEvent Lib "winmm.dll" (ByVal uDelay As Integer, ByVal uResolution As Integer, ByVal lpFunction As TimerProcDelegate, ByVal dwUser As Integer, ByVal uFlags As Integer) As Integer
Public Declare Function timeKillEvent Lib "winmm.dll" (ByVal uID As Integer) As Integer
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Integer)
Public Declare Function timeGetTime Lib "winmm.dll" () As Integer

Public gIntTimerID As Integer '高精度タイマID

' <<<< タイマの起動 >>>>
Public Sub TimerStart()

Call timeBeginPeriod(20)
gIntTimerID = timeSetEvent(20, 10, AddressOf TimerProc, 0, 1)
End Sub

' <<<< タイマの停止 >>>>
Public Sub TimerStop()
Call timeKillEvent(gIntTimerID)
Call timeEndPeriod(50)
Call Sleep(100)
End Sub

' <<<< 高精度タイマ(20mSec) >>>>
Public Sub TimerProc(ByVal uTimerID As Integer, ByVal uMsg As Integer, ByVal dwUser As Integer, ByVal dw1 As Integer, ByVal dw2 As Integer)
Dim rInt As Integer

rInt = timeGetTime
End Sub

よろしくお願いいたします。
よねKEN
ぬし
会議室デビュー日: 2003/08/23
投稿数: 472
投稿日時: 2007-04-12 13:23
「AddressOf TimerProc」で生成されたTimerProcDelegateデリゲートの参照は
どこにも保持されていませんので、ガベージコレクションが動作すると
このデリゲートは回収されてしまいます。そのため発生している問題だと思います。

--
例えば、procという変数を以下のように用意しておきます。
Private proc As TimerProcDelegate

次に下記のコードを修正します。

> gIntTimerID = timeSetEvent(20, 10, AddressOf TimerProc, 0, 1)

proc = AddressOf TimerProc
gIntTimerID = timeSetEvent(20, 10, proc , 0, 1)

T3HKYM
会議室デビュー日: 2004/01/29
投稿数: 15
投稿日時: 2007-04-12 13:44
よねKEN様
ありがとうございました。
AddressOf TimerProcの参照の問題であったのですね。
よくわかりました。
おかげでエラーが発生することはなくなりました。
1

スキルアップ/キャリアアップ(JOB@IT)