Запустить таймер в фоновом режиме в визуальной базовой форме - PullRequest
0 голосов
/ 27 марта 2019

сначала я новичок в этом, и у меня есть этот код, который показывает приглашение перезапустить или отложить перезапуск на некоторое время, проблема в том, что я хочу, чтобы скрыть сообщение и вернуть его по истечении времени, указанного впользователь.

Я использую «визуальную базовую форму», и время, когда перезапуск будет отложен, выбирается из «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

В первом предложении «Если» ниже я хочу запустить таймер и скрыть форму, а во втором «Если» я хочу вернуть его обратно в форму, но форма остается скрытой.

    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

Я пытался поместить второе предложение "Если" в другом месте, но не работает, что я делаю неправильно.

1 Ответ

2 голосов
/ 28 марта 2019

Я предполагаю, что ваш класс Timer1 вызывает событие Timer1.Tick каждый раз x после вызова Timer1.Start ().Тот факт, что форма может скрываться, говорит мне, что 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

Хотя я бы порекомендовал вам попробовать другие решения, такие как таймер, инициирующий событие, только когда он достигает истекшего времени(так что вам не нужно обрабатывать каждый тик без необходимости).Я также рекомендовал бы изучить универсальное приложение для Windows с уведомлениями Toast, так как вы можете настроить отображение уведомлений в определенное время (обрабатывается Windows), чтобы вам не требовался поток, работающий в фоновом режиме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...