2015-01-21 81 views
0

我做了一個小程序,允許單擊每個按鈕的單個計時器倒計時。 (例如,點擊按鈕1將啓動按鈕1的倒計時,同時更新按鈕本身上的文本以反映剩餘時間。)VB線程計時器更新UI

我現在擔心的是我不確定我的程序在多大程度上能夠在長跑。這是代碼的一小部分。

Private Sub depBtn_Clicked(sender As Button, e As EventArgs) 
    If sender.BackColor = Color.Green Then 
     Dim depRow() As Data.DataRow 
     Dim id As String = sender.Name 
     depRow = DepartmentDataSet.Departments.Select("ID Like '" & id & "'")   
     sender.BackColor = Color.Red 

     Dim timerBtn As New DepartmentTimer(sender, depRow(0)("Duration"), depRow(0)("ID")) 

     Dim TimerDelegate As New System.Threading.TimerCallback(AddressOf TimerTask) 
     Dim TimerItem As New System.Threading.Timer(TimerDelegate, timerBtn, 0, 1000) 
     timerBtn.timerRef = TimerItem 
    End If 
End Sub 

Private Delegate Sub TimerTaskDelegate(ByVal obj As Object) 

Private Sub TimerTask(ByVal obj As Object) 
    If Me.InvokeRequired() Then 
     Me.Invoke(New TimerTaskDelegate(AddressOf TimerTask), obj) 
    Else 
     Dim depTimer As DepartmentTimer = DirectCast(obj, DepartmentTimer) 
     depTimer.countDown() 

     If depTimer.duration = -1 Then 
      depTimer.finish() 
      depTimer.timerRef.Dispose() 
     End If 
    End If 
End Sub 

我已閱讀並也經歷了,如果我是在UI線程上直接從計時器回調更新整個程序將崩潰。所以我最終根據http://tech.xster.net/tips/invoke-ui-changes-across-threads-on-vb-net/來使用代理。

這是一個正確的做法或我做任何冗餘/效率低下? 另外,當我處置Timer對象。我將如何去清理DepartmentTimer類實例(timerBtn)?一旦定時器耗盡,該按鈕可以再次激活,所以如果我沒有正確地處理它們,我擔心這些情況會累積起來。

在此先感謝您的幫助。

回答

0

既然你不到底用定時器任何東西,除了立即調用返回到主UI線程,你可能也只是使用一個 System.Windows.Forms.Timer並更新他們都在同一個處理程序。

喜歡的東西:

Public Class Form1 

    Private timers As New List(Of DepartmentTimer) 
    Private WithEvents Tmr As New System.Windows.Forms.Timer 

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load 
     Tmr.Interval = 1000 
     Tmr.Start() 
    End Sub 

    Private Sub depBtn_Clicked(sender As Button, e As EventArgs) 
     If sender.BackColor = Color.Green Then 
      Dim depRow() As Data.DataRow 
      Dim id As String = sender.Name 
      depRow = DepartmentDataSet.Departments.Select("ID Like '" & id & "'") 
      sender.BackColor = Color.Red 

      timers.Add(New DepartmentTimer(sender, depRow(0)("Duration"), depRow(0)("ID"))) 
     End If 
    End Sub 

    Private Sub Tmr_Tick(sender As Object, e As EventArgs) Handles Tmr.Tick 
     For i As Integer = timers.Count - 1 To 0 Step -1 
      Dim depTimer As DepartmentTimer = timers(i) 
      depTimer.countDown() 

      If depTimer.duration = -1 Then 
       depTimer.finish() 
       timers.RemoveAt(i) 
      End If 
     Next 
    End Sub 

End Class 
+0

對不起回合這一點,但將意味着所有的按鈕將在相同的時間間隔倒計時?如果我在不同的時間點擊按鈕怎麼辦? – DamonAskavio 2015-01-21 07:36:06

+0

不是。它們每秒更新一次,但每個DepartmentTimer實例中都有自己的持續時間。另外,我在我的例子中定義了「定時器」的聲明。試試看看它是否有效。只需註釋掉你的代碼,以便恢復。 – 2015-01-21 15:01:49