2015-09-25 65 views
0

我有下面的代码,它应该加载窗体,每秒更改文本,然后在最后运行关机命令。 取消按钮可以取消关机(或关闭表单,阻止关机命令运行)。VB.NET - 关机定时器/睡眠标签

Public Class FRM_SHUTDOWN 

Private Sub FRM_SHUTDOWN_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    LBL_TIMER.Text = "Shutting Down in 6..." 
End Sub 

Private Sub FRM_SHUTDOWN_Shown(sender As Object, e As EventArgs) Handles Me.Shown 
    LBL_TIMER.Text = "Shutting Down in 6..." 
    Threading.Thread.Sleep(1000) 
    LBL_TIMER.Text = "Shutting Down in 5..." 
    Threading.Thread.Sleep(1000) 
    LBL_TIMER.Text = "Shutting Down in 4..." 
    Threading.Thread.Sleep(1000) 
    LBL_TIMER.Text = "Shutting Down in 3..." 
    Threading.Thread.Sleep(1000) 
    LBL_TIMER.Text = "Shutting Down in 2..." 
    Threading.Thread.Sleep(1000) 
    LBL_TIMER.Text = "Shutting Down in 1..." 
    Threading.Thread.Sleep(1000) 
    LBL_TIMER.Text = "Windows is Shutting Down" 
    Threading.Thread.Sleep(1000) 
    'System.Diagnostics.Process.Start("shutdown", "-s -t 0") 
    MessageBox.Show("Shutdown instant would happen here") 
End Sub 

Private Sub BTN_CANCEL_Click(sender As Object, e As EventArgs) Handles BTN_CANCEL.Click 
    'System.Diagnostics.Process.Start("shutdown", "-a") 
    MessageBox.Show("Cancel shutdown command") 
    Me.Close() 
End Sub 

末级

我遇到的问题是,形式加载并显示如下: enter image description here

所以它实际上并没有显示“停止”按钮,或在倒计时计时器!

任何人都可以解释为什么吗?

回答

2

您的应用程序正忙于等待,因此无法重新绘制窗体(添加LBL_TIMER.Refresh会有所帮助,但不是正确的方式)。您需要在与UI线程分开的线程中等待。

最简单的方法是使用后台工作器。这为您处理UI线程和后台线程之间的一些同步。

在表单加载时运行工作人员,然后在工作人员DoWork方法中等待。

可以回用ReportProgress方法

Private WithEvents _worker As New BackgroundWorker With 
    {.WorkerReportsProgress = True, .WorkerSupportsCancellation = True} 
Private _cancelled As Boolean = False 

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    _worker.RunWorkerAsync() 
End Sub 

Private Sub _worker_DoWork(sender As Object, e As DoWorkEventArgs) Handles _worker.DoWork 
    _cancelled = False 
    For i As Integer = 6 To 1 Step -1 
     CType(sender, BackgroundWorker).ReportProgress(i) 
     Threading.Thread.Sleep(1000) 
     If CType(sender, BackgroundWorker).CancellationPending Then Exit Sub 
    Next 
End Sub 

Private Sub _worker_ProgressChanged(sender As Object, e As ProgressChangedEventArgs) Handles _worker.ProgressChanged 
    Label1.Text = "Shutting down in " & e.ProgressPercentage 
End Sub 

Private Sub _worker_RunWorkerCompleted(sender As Object, e As RunWorkerCompletedEventArgs) Handles _worker.RunWorkerCompleted 
    If _cancelled Then 
     MessageBox.Show("Shutdown was cancelled") 
    Else 
     MessageBox.Show("Shutdown instant would happen here") 
    End If 

End Sub 

Private Sub btnCancel_Click(sender As Object, e As EventArgs) Handles btnCancel.Click 
    _cancelled = True 
    _worker.CancelAsync() 
End Sub 
+0

辉煌汇报你的进展!这样可行!现在我明白了,因为它正在运行睡眠命令,所以它不能执行其他功能。我懂了! – GlenRitchie

+0

更新:取消按钮实际上并不阻止关机。按'取消关机'时我将如何停止工作人员? – GlenRitchie

+0

添加了一些代码来显示处理取消。 –