以Visual Basic形式在后台运行计时器

时间:2019-03-27 20:25:21

标签: vb.net visual-studio visual-studio-2017

首先,我是新手,我有这段代码显示提示重新启动或将重新启动推迟一会儿,问题是我想隐藏消息并在指定的时间后将其恢复用户。

我使用的是“ Visual Basic表单”,从“组合框”中选择重新启动的时间将被推迟

我的代码如下。

Imports System.Management
Imports System.Security.Permissions
Imports System
Imports System.IO
Imports System.Collections
Imports System.SerializableAttribute

Public Class Form2

    Dim PostponeReboot As Integer = 50

    Private Const CP_NOCLOSE_BUTTON As Integer = &H200
    Protected Overloads Overrides ReadOnly Property CreateParams() As CreateParams
        Get
            Dim myCp As CreateParams = MyBase.CreateParams
            myCp.ClassStyle = myCp.ClassStyle Or CP_NOCLOSE_BUTTON
            Return myCp
        End Get
    End Property

    Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Form1.Hide()
        Label4.Text = SystemInformation.UserName
        Button1.Enabled = False
        ComboBox1.Enabled = False
        Timer1.Interval = 1000
    End Sub

    Private Sub CheckBox1_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox1.CheckedChanged

        If CheckBox1.Checked Then
            CheckBox2.Enabled = False
            Button1.Enabled = True
            ComboBox1.Enabled = False
        ElseIf CheckBox1.Checked = 0 Then
            CheckBox2.Enabled = True
            Button1.Enabled = False
            ComboBox1.Enabled = False
        End If

    End Sub

    Private Sub CheckBox2_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox2.CheckedChanged
        If CheckBox2.Checked Then
            CheckBox1.Enabled = False
            ComboBox1.Enabled = True
            Button1.Enabled = True
        ElseIf CheckBox2.Checked = 0 Then
            CheckBox1.Enabled = True
            ComboBox1.Enabled = False
            Button1.Enabled = False
        End If
    End Sub

    Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, e As EventArgs) Handles ComboBox1.SelectedIndexChanged
        If ComboBox1.Text = "1 Hora" Then
            PostponeReboot = 10
        ElseIf ComboBox1.Text = "2 Horas" Then
            PostponeReboot = 20
        ElseIf ComboBox1.Text = "4 Horas" Then
            PostponeReboot = 40
        ElseIf ComboBox1.Text = "Seleccione" Then
            Button1.Enabled = False
        End If
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        If CheckBox1.Checked Then
            MessageBox.Show("Rebooting")
            'Shell("shutdown -r -f -t 60")
            Form1.Close()
            End
        ElseIf CheckBox2.Checked Then
            MessageBox.Show(PostponeReboot)
            Timer1.Start()
            Me.Hide()
        End If

        If PostponeReboot = 0 Then
            Me.Show()
        Else
            Me.Hide()
        End If

    End Sub


    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        PostponeReboot = PostponeReboot - 1
        'Label5.Text = PostponeReboot
    End Sub

End Class

在下面的第一个“ If”句子中,我想启动计时器并隐藏表单,在第二个“ If”中,我想将其带回表单,但是表单仍处于隐藏状态。

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            If CheckBox1.Checked Then
                MessageBox.Show("Rebooting")
                'Shell("shutdown -r -f -t 60")
                Form1.Close()
                End
            ElseIf CheckBox2.Checked Then
                MessageBox.Show(PostponeReboot)
                Timer1.Start()
                Me.Hide()
            End If

            If PostponeReboot = 0 Then
                Me.Show()
            Else
                Me.Hide()
            End If

        End Sub

我尝试将第二个“ If”句子放在另一个位置,但不起作用,这是我做错了。

1 个答案:

答案 0 :(得分:2)

我在这里假设您的Timer1类在调用Timer1.Start()之后每x次引发一次Timer1.Tick事件。表单可以隐藏的事实告诉我Timer1.Start()不是阻塞方法。这样,第二个if语句将在隐藏表单之后立即得到验证,而无需等待PostponeReboot变量达到零。然后,该特定的按钮处理程序将退出,并且您的表单将保持隐藏状态。我看到的是您已经为计时器的每个刻度提供了一个事件处理程序。为什么不使用此处理程序来验证您的PostponeReboot变量的状态?

Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    PostponeReboot = PostponeReboot - 1

    If PostponeReboot = 0 Then
        Timer1.Stop() 'I would assume
        Me.Show()
    End If
End Sub

尽管,我建议您尝试其他解决方案,例如让计时器仅在经过时间时才引发事件(因此您不必不必要地处理每个滴答声)。我还建议您查看带有Toast通知的通用Windows应用程序,因为您可以将通知设置为在设置的时间显示(由Windows处理),这样您就不必为此在后台运行线程。