【问题标题】:Run timer in background in visual basic form以 Visual Basic 形式在后台运行计时器
【发布时间】:2019-08-18 12:45:19
【问题描述】:

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

我使用的是“visual basic form”,重启的时间将被推迟,它是从“ComboBox”中选择的

我的代码如下。

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

我尝试将第二个“如果”句子放在另一个地方但不起作用,我做错了什么。

【问题讨论】:

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


    【解决方案1】:

    我在这里假设您的 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 处理),这样您就不必为此在后台运行线程。

    【讨论】:

    • 这是真的,太基本了,我忘记输入 PostponeReboot 变量到达“0”并继续 -1、-2、-3 等等。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-30
    • 2013-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多