| 分類:[.NET 全般]
タイマーオブジェクトを作成して定期的にある関数を呼ぶような プログラムを作成しているのですが、Form1クラスのMsgBox("test") を実行するとTestTimerクラスのlfExecProcメソッドを数十回(1秒もかからない間隔で)と 勝手に処理されてしまいます。TestTimerクラスのlvObjTmrを破棄すれば 問題は解決しますが、なぜこのような現象が起こるかが不明です。 明確な原因等をご教示ください。
以下に作成した環境とプログラムを簡略化したもの(ビルド、実行可) 記載しました。
●環境 OS :Windows10 開発環境:Visual Studio2015
●TestFormのプロジェクト設定 対象のフレームワーク :.NET Framework4.6 アプリケーションの種類 :Windowsフォームアプリケーション 対象のCPU :AnyCPU 32ビットを優先にチェック 参照DLL :TestTimerDll.dllならびにsystem.*関連 ソース :Form1.vbのみ(画面にButtonを配置しているのみ)
******************************************* Form1.vbの内容 *******************************************
Public Class Form1 Private objTm As TestTimerDll.TestTimer Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click System.Windows.Forms.Application.DoEvents() objTm = New TestTimerDll.TestTimer If objTm.testFunction() = True Then objTm.timerSet() Else If objTm.testFunction() = False Then MsgBox("test") Me.Close() End If End If End Sub End Class
●TestTimerDllのプロジェクト設定 対象のフレームワーク :.NET Framework4.6 アプリケーションの種類 :Windowsフォームアプリケーション 対象のCPU :AnyCPU 32ビットを優先にチェック 参照DLL :system.*関連(DrawingとFormを追加) ソース :TestTimer.vbとfmXXTimer.vb
******************************************* TestTimer.vbの内容 ******************************************* Public Class TestTimer
Private WithEvents lvObjTmr As New fmXXTimer
Public Sub New() MyBase.New() End Sub
Public Function timerSet() As Boolean lvObjTmr.tmrExe.Interval = 2000 Return True End Function
Public Function testFunction() As Boolean Return False End Function
Private Function lfExecProc() As Boolean Dim test As String test = "" Return True End Function
Private Sub lvObjTmr_GoExe() Handles lvObjTmr.GoExe Call lfExecProc() End Sub
End Class
******************************************* fmXXTimer.vbの内容 *******************************************
Option Strict Off Option Explicit On Friend Class fmXXTimer Inherits System.Windows.Forms.Form Public Event GoExe()
Private Sub fmXXTimer_Load(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles MyBase.Load tmrExe.Interval = 0 End Sub Private Sub Form_Terminate_Renamed() tmrExe.Interval = 0 End Sub Private Sub fmXXTimer_FormClosed(ByVal eventSender As System.Object, ByVal eventArgs As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed tmrExe.Interval = 0 End Sub Private Sub tmrExe_Tick(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles tmrExe.Tick RaiseEvent GoExe() End Sub End Class
|