|
分類:[.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
|