可以从类中调用并形成

时间:2016-01-04 17:41:55

标签: vb.net timer

我有一个简单的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方法。

2 个答案:

答案 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。请注意,由于你没有同步它,我相信它会在一个线程中运行所以在那里要小心一点:)