- - PR -
TimeSetEventについて
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 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 よろしくお願いいたします。 |
|
投稿日時: 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) |
|
投稿日時: 2007-04-12 13:44
よねKEN様
ありがとうございました。 AddressOf TimerProcの参照の問題であったのですね。 よくわかりました。 おかげでエラーが発生することはなくなりました。 |
1