2017-06-15 20 views
0

私は別々に動作する複数のカウントダウンタイマーを作ろうとしています。カウントダウンタイマーごとにコードを記述するのではなく、どのようにグループ化してこれを簡単な方法で達成するのですか?別々に動作する複数のカウントダウンタイマー

Public Class Form1 
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    Timer1.Start() 
End Sub 

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    Timer2.Start() 
End Sub 

Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    Timer3.Start() 
End Sub 

Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick 
    Timer1.Interval = 1000 
    If Val(Label1.Text) = 0 Then 
     Timer1.Stop() 
    Else 
     Label1.Text = Val(Label1.Text) - 1 
    End If 
End Sub 

Private Sub Timer2_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick 
    Timer2.Interval = 1000 
    If Val(Label2.Text) = 0 Then 
     Timer2.Stop() 
    Else 
     Label2.Text = Val(Label2.Text) - 1 
    End If 
End Sub 

Private Sub Timer3_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick 
    Timer3.Interval = 1000 
    If Val(Label3.Text) = 0 Then 
     Timer3.Stop() 
    Else 
     Label3.Text = Val(Label3.Text) - 1 
    End If 
End Sub 
End Class 

答えて

0

ただ、単一のタイマー実行を継続:

Public Class Form1 

    Sub New() 

    ' This call is required by the designer. 
    InitializeComponent() 

    ' Add any initialization after the InitializeComponent() call. 
    Timer1.Interval = 1000 
    Timer1.Start() 
    End Sub 

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    Label1.Text = "10" 
    End Sub 

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click 
    Label2.Text = "20" 
    End Sub 

    Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click 
    Label3.Text = "30" 
    End Sub 


    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick 
    If CInt(Val(Label1.Text)) > 0 Then 
     Label1.Text = (CInt(Val(Label1.Text)) - 1).ToString 
    End If 
    If CInt(Val(Label2.Text)) > 0 Then 
     Label2.Text = (CInt(Val(Label2.Text)) - 1).ToString 
    End If 
    If CInt(Val(Label3.Text)) > 0 Then 
     Label3.Text = (CInt(Val(Label3.Text)) - 1).ToString 
    End If 
    End Sub 


End Class 
0

ただ、Microsoftの反応性フレームワーク(NuGet "System.Reactive")を使用して、あなたがこれを行うことができます。

Dim start As Func(Of Integer, Label, IDisposable) = _ 
    Function(n, lb) 
     Return Observable _ 
      .Interval(TimeSpan.FromSeconds(1.0)) _ 
      .Take(n) _ 
      .Subscribe(Sub(x) lb.Text = (CLng(n) - x).ToString()) 
    End Function 

Dim subscription1 = start(10, Label1) 
Dim subscription2 = start(20, Label2) 
Dim subscription3 = start(30, Label3) 

それです。それがすべてのコードです。

Observableが自然に完了すると、Intervalタイマーが自動的に停止します。 Observableが完了する前に停止したい場合は、次のコードを実行してください。

関連する問題