按下按钮后尝试更改计时器

时间:2013-11-21 06:59:41

标签: vb.net

我每隔60秒检查一次,如果闹钟是真的,它会打开form2播放一首歌等。

但是form2上的按钮应该设置waittimer = 180000,这应该在半小时后进行下一次检查。

我不习惯使用计时器,我做错了什么?

Public Class Form1
Public Property waittimer As Integer
Public Property playsong As Boolean = True
Private WithEvents Tmr As New Timer

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    If (Process.GetProcessesByName(Process.GetCurrentProcess.ProcessName).Length > 1) Then
        Application.Exit()
    End If
    Tmr.Enabled = False
    Tmr.Interval = TimeSpan.FromSeconds(60).TotalMilliseconds
    BackgroundWorker1.RunWorkerAsync()
End Sub

Private Sub NotifyIcon1_MouseDoubleClick(sender As Object, e As MouseEventArgs) Handles NotifyIcon1.MouseDoubleClick
    playsong = False
    Try


        ' Create a request for the URL. 
        Dim request As WebRequest = _
          WebRequest.Create("http://example.com/example.aspx")
        ' If required by the server, set the credentials.
        request.Credentials = CredentialCache.DefaultCredentials
        ' Get the response.
        Dim response As WebResponse = request.GetResponse()
        ' Display the status.
        Console.WriteLine(CType(response, HttpWebResponse).StatusDescription)
        ' Get the stream containing content returned by the server.
        Dim dataStream As Stream = response.GetResponseStream()
        ' Open the stream using a StreamReader for easy access.
        Dim reader As New StreamReader(dataStream)
        ' Read the content.
        Dim responseFromServer As String = reader.ReadToEnd()
        ' Display the content.
        Console.WriteLine(responseFromServer)
        ' Clean up the streams and the response.
        reader.Close()
        response.Close()

        Dim responseArray() As String
        responseArray = Split(responseFromServer, "|")

        Dim D As New Data
        D.maxcalls = responseArray(0)
        D.cph = responseArray(1)
        D.mht = responseArray(2)
        D.alarm = responseArray(3)
        Form2.startsong(D)
    Catch ex As Exception

    End Try
    playsong = True
End Sub

Private Sub ExitToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles ExitToolStripMenuItem.Click
    Application.Exit()
    End
End Sub

Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    Try
        If waittimer = 180000 Then
            Tmr.Interval = waittimer
            Tmr.Start()
            waittimer = 60000
        Else
            waittimer = 60000
        End If

        ' Create a request for the URL. 
        Dim request As WebRequest = _
          WebRequest.Create("http://example.com/example.aspx")
        ' If required by the server, set the credentials.
        request.Credentials = CredentialCache.DefaultCredentials
        ' Get the response.
        Dim response As WebResponse = request.GetResponse()
        ' Display the status.
        Console.WriteLine(CType(response, HttpWebResponse).StatusDescription)
        ' Get the stream containing content returned by the server.
        Dim dataStream As Stream = response.GetResponseStream()
        ' Open the stream using a StreamReader for easy access.
        Dim reader As New StreamReader(dataStream)
        ' Read the content.
        Dim responseFromServer As String = reader.ReadToEnd()
        ' Display the content.
        Console.WriteLine(responseFromServer)
        ' Clean up the streams and the response.
        reader.Close()
        response.Close()

        Dim responseArray() As String
        responseArray = Split(responseFromServer, "|")

        Dim D As New Data
        D.maxcalls = responseArray(0)
        D.cph = responseArray(1)
        D.mht = responseArray(2)
        D.alarm = responseArray(3)
        D.forcealarm = False
        e.Result = D
    Catch ex As Exception
        Dim D As New Data
        D.maxcalls = 404
        D.cph = 404
        D.mht = 404
        D.alarm = True
        D.forcealarm = True
        e.Result = D
    End Try

    Tmr.Interval = waittimer
End Sub

Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
    If Not IsNothing(e.Result) Then
        Dim strtime As String
        Dim englandtime = System.TimeZoneInfo.ConvertTime(Now, TimeZoneInfo.FindSystemTimeZoneById("UTC"))
        strtime = DatePart(Microsoft.VisualBasic.DateInterval.Hour, englandtime) & DatePart(Microsoft.VisualBasic.DateInterval.Minute, englandtime)

        Dim D As Data = DirectCast(e.Result, Data)
        If D.forcealarm = True Then
            Form2.startsong(D)
        End If
        If D.alarm Then
            If strtime < 730 And strtime > 0 Then

            Else
                Form2.startsong(D)
            End If
        End If
    End If
    Tmr.Start()
End Sub

Private Sub Tmr_Tick(sender As Object, e As System.EventArgs) Handles Tmr.Tick
    Tmr.Stop()
    BackgroundWorker1.RunWorkerAsync()
End Sub

End Class

Public Class Data
Public Property maxcalls As Integer
Public Property cph As Integer
Public Property mht As Integer
Public Property alarm As Boolean
Public Property forcealarm As Boolean
End Class

窗体2

Public Class Form2
Public audio As New AudioFile(My.Application.Info.DirectoryPath & "\Help.mp3")
Public Sub startsong(ByVal D As Data)
    Me.Show()
    MHTvalue.Text = D.mht.ToString
    Maxcallsvalue.Text = D.maxcalls
    CPHvalue.Text = D.cph
    If Form1.playsong = True Then
        audio.Play()
    End If

End Sub

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    ' Me.Close()
    audio.Stop()
    Form1.waittimer = 180000
End Sub

Private Sub Form2_Closing(sender As Object, e As EventArgs) Handles MyBase.Load
    audio.Stop()
    Form1.waittimer = 180000
End Sub

Private Sub Form2_Minimize(sender As Object, e As EventArgs) Handles MyBase.Load
    audio.Stop()
    Form1.waittimer = 180000
End Sub

2 个答案:

答案 0 :(得分:0)

这可能是因为原始form1实例上的计时器永远不会被您的代码重新配置。而是在未运行(显示)的表单1的新副本上设置计时器。

您需要获取最初打开的form1的运行实例。我使用的一种技术是标记我将要查找的表单,然后单步执行当前运行的表单实例,通过其标记获取表单,将找到的表单设置为与我正在使用的对象相同,然后使用该表格的属性/方法。

将form1的标记设置为“myTag”。

然后在表格2上:

        For Each f As Form In My.Application.OpenForms

            If Not f.InvokeRequired Then
                'Can access the form directly.

                If f.Tag = "myTag" Then
                    'this is my form
                    Dim fcast As New form1
                    fcast = f
                    fcast.<---- use your methods / properties...
                End If

            End If

        Next

答案 1 :(得分:0)

只需改变:

Public Property waittimer As Integer

要:

Public Property waittimer As Integer
    Get
        Return Tmr.Interval
    End Get
    Set(value As Integer)
        If value > 0 Then
            Tmr.Interval = value
        End If
    End Set
End Property

您正在更改waittimer值,但不是更改Timer的实际Interval()。这将两者联系在一起。

相关问题