我有一个简单的WinForm应用程序。该应用程序的主要入口点是mainForm。我在窗体上使用Timer,定时器间隔设置为2000ms。 Timer的Tick事件如下,
Public myValue as Integer = 100
Private Sub myTimer_Tick(sender As Object, e As EventArgs) Handles myTimer.Tick
If myValue = 0 Then
myTimer.Enabled = False
Else
myValue = myValue -1
End If
End Sub
加载mainForm时,在应用程序启动时调用计时器。现在myValue是一个全局变量,为了简单起见,我使用了它,否则它被一些进程计数机制所取代,这里不需要解释。
只要我在某些特定表单上使用Windows.Forms.Timer,我就可以使用这种方法。我有两个场景,这种方法失败了。
1 - 我必须在其他表单上使用相同的功能,目前我在另一个表单上使用单独的Timer,它有自己的Tick事件。
2 - 我必须使用来自另一个模块/类的相同功能,我无法实现这一点,因为要实现这一点,我需要一个表单。
现在我开始研究Threading.Timer。我面临的问题是,我不知道如何等待Threading.Timer完成,因为控件在调用Threading.Timer后进入下一行。我不确定这是否可以在WaitHandle的帮助下完成。另外我已经读过Threading.Timer为它的每个Tick创建一个单独的Thread。在我的简单场景中,这似乎有些过分。
我只想使用Timer功能而不需要Form。我也可以在其中使用带有Thread.Sleep的Do循环创建类似的功能,但除非我确定我的Timer功能在其他情况下不起作用,否则我将坚持使用我的Timer方法。
答案 0 :(得分:1)
我明白了......如果是这样,你应该真正创建一个运行循环的第二个线程。该线程有一些退出的参数,表明操作已完成,Thread本身设置为Isbackground = false。
但是,你也可以这样做......
Imports System.Timers
Public Class Main
Private Shared WithEvents m_oTimer As Timers.Timer = Nothing
Private Shared m_oWaitHandle_TimerHasCompleted As System.Threading.AutoResetEvent = Nothing
Public Shared Sub Main()
Try
'Application Entry point ...
'Create the global timer
m_oTimer = New Timers.Timer
With m_oTimer
.AutoReset = True
.Interval = 2000
.Start()
End With
'Create the WaitHandle
m_oWaitHandle_TimerHasCompleted = New System.Threading.AutoResetEvent(False)
'Show your form
Dim oFrm As New Form1
Application.Run(oFrm)
'Wait for the timer to also indicate that it has finished before exiting
m_oWaitHandle_TimerHasCompleted.WaitOne()
Catch ex As Exception
'Error Handling here ...
End Try
End Sub
Private Shared Sub m_oTimer_Elapsed(sender As Object, e As ElapsedEventArgs) Handles m_oTimer.Elapsed
'Timer will fire here ...
Try
If 1 = 2 Then
m_oWaitHandle_TimerHasCompleted.Set()
End If
Catch ex As Exception
'Error Handling ...
End Try
End Sub
End Class
请注意'm_oWaitHandle_TimerHasCompleted.Set()'永远不会运行,您必须添加条件...但是,一旦运行,WaitOne将完成,应用程序将根据需要退出。
怎么样?
答案 1 :(得分:0)
听起来我想要创建一个计时器的单个实例,不需要通过表单实例化?
如果是这样的话......创建一个名为' Main'并将以下内容复制到其中。
Imports System.Timers
Public Class Main
Private Shared WithEvents m_oTimer As Timers.Timer = Nothing
Public Shared Sub Main()
Try
'Application Entry point ...
'Create the global timer
m_oTimer = New Timers.Timer
With m_oTimer
.AutoReset = True
.Interval = 2000
.Start()
End With
'Show your form
Dim oFrm As New Form1
Application.Run(oFrm)
Catch ex As Exception
'Error Handling here ...
End Try
End Sub
Private Shared Sub m_oTimer_Elapsed(sender As Object, e As ElapsedEventArgs) Handles m_oTimer.Elapsed
'Timer will fire here ...
Try
Catch ex As Exception
'Error Handling ...
End Try
End Sub
End Class
完成后,右键单击您的项目并选择“属性”。在“应用程序”标签中,您会看到一个名为“启用应用程序框架”的复选框。取消选中此框。现在,在名为' Startup Object'你现在应该看到' Sub Main' ....选择那个。
当应用程序运行时,Sub Main现在将运行而不是您的表单。
这将创建将在表单外部触发的Timer。请注意,由于你没有同步它,我相信它会在一个线程中运行所以在那里要小心一点:)