Dann wäre es wiederrum easy.
EDIT: Jetzt mit Endless-Funktion
Form
Klasse Recheneinheit
EDIT: Jetzt mit Endless-Funktion
VB.NET-Quellcode
- Public Einheit1 As Recheneinheit
- Public Einheit2 As Recheneinheit
- Private Sub btnStart_Click(sender As Object, e As EventArgs) Handles btnStart.Click
- Dim Zähler1 As New Recheneinheit
- Zähler1.Milliseconds = 5000
- Zähler1.Steps = 1270
- Zähler1.Typ = Recheneinheit.Zähltypen.EndlessCountDown
- Zähler1.AufrufendeForm = Me
- Einheit1 = Zähler1
- AddHandler Zähler1.NextStep, AddressOf NextStep
- Zähler1.Start()
- Dim Zähler2 As New Recheneinheit
- Zähler2.Milliseconds = 5000
- Zähler2.Steps = 1270
- Zähler2.Typ = Recheneinheit.Zähltypen.EndlessCountUp
- Zähler2.AufrufendeForm = Me
- Einheit2 = Zähler2
- AddHandler Zähler2.NextStep, AddressOf NextStep
- Zähler2.Start()
- End Sub
- Private Sub NextStep(Einheit As Recheneinheit, NextStep As Integer)
- Select Case Einheit.Identifier
- Case Einheit1.Identifier
- Label1.Text = NextStep.ToString
- Case Einheit2.Identifier
- Label2.Text = NextStep.ToString
- End Select
- End Sub
- Private Sub btnStop_Click(sender As Object, e As EventArgs) Handles btnStop.Click
- Einheit1.Cancel()
- Einheit2.Cancel()
- End Sub
VB.NET-Quellcode
- Public Class Recheneinheit
- Public Enum Zähltypen
- CountUp
- CountDown
- EndlessCountUp
- EndlessCountDown
- End Enum
- Public Property Identifier As Guid
- Public Property Milliseconds As Integer
- Public Property InitialMS As Integer
- Public Property AciveMS As Integer
- Public Property Value As Integer
- Public Property Steps As Integer
- Public Property Typ As Zähltypen
- Public Property AufrufendeForm As Form
- Private LastValue As Integer
- Public Event NextStep(Einheit As Recheneinheit, xStep As Integer)
- Public WithEvents IntervalTimer As New Timer
- Public Sub Start()
- Dim DN As Date = Date.Now
- InitialMS = DN.Minute * 60000 + DN.Second * 1000 + DN.Millisecond
- If Steps = 0 Then
- Steps = 1270
- End If
- If Typ = Nothing Then
- Typ = Zähltypen.CountUp
- End If
- LastValue = 0
- IntervalTimer.Interval = 1
- IntervalTimer.Start()
- End Sub
- Public Sub Timer_Tick(sender As Object, e As EventArgs) Handles IntervalTimer.Tick
- Dim DN As Date = Date.Now
- AciveMS = DN.Minute * 60000 + DN.Second * 1000 + DN.Millisecond
- Zählen(AciveMS - InitialMS)
- End Sub
- Private Sub Zählen(NewValue As Integer)
- Value = NewValue / Milliseconds * Steps
- Task.Factory.StartNew(Sub()
- Dim y As Integer = Math.Truncate(Value)
- For i = LastValue To y - 1
- If i < Steps AndAlso i > 0 Then
- Select Case Typ
- Case Zähltypen.CountUp, Zähltypen.EndlessCountUp
- AufrufendeForm.Invoke(Sub()
- RaiseEvent NextStep(Me, i)
- End Sub)
- Case Zähltypen.CountDown, Zähltypen.EndlessCountDown
- AufrufendeForm.Invoke(Sub()
- RaiseEvent NextStep(Me, Steps - i)
- End Sub)
- End Select
- ElseIf i >= Steps AndAlso Typ = Zähltypen.CountUp Then
- AufrufendeForm.Invoke(Sub()
- RaiseEvent NextStep(Me, Steps)
- End Sub)
- Exit Sub
- ElseIf (Steps - i) <= 0 AndAlso Typ = Zähltypen.CountDown Then
- AufrufendeForm.Invoke(Sub()
- RaiseEvent NextStep(Me, 0)
- End Sub)
- Exit Sub
- ElseIf i >= Steps AndAlso Typ = Zähltypen.EndlessCountUp Then
- Dim DN As Date = Date.Now
- InitialMS = DN.Minute * 60000 + DN.Second * 1000 + DN.Millisecond
- AufrufendeForm.Invoke(Sub()
- RaiseEvent NextStep(Me, Steps)
- End Sub)
- ElseIf (Steps - i) <= 0 AndAlso Typ = Zähltypen.EndlessCountDown Then
- Dim DN As Date = Date.Now
- InitialMS = DN.Minute * 60000 + DN.Second * 1000 + DN.Millisecond
- AufrufendeForm.Invoke(Sub()
- RaiseEvent NextStep(Me, 0)
- End Sub)
- End If
- Next
- LastValue = y
- End Sub)
- If (Value >= Steps OrElse Value <= 0) AndAlso Not Typ = Zähltypen.EndlessCountUp AndAlso Not Typ = Zähltypen.EndlessCountDown Then
- IntervalTimer.Stop()
- End If
- End Sub
- Public Sub Cancel()
- IntervalTimer.Stop()
- End Sub
- Public Sub New()
- Identifier = Guid.NewGuid
- End Sub
- End Class
Ein Computer wird das tun, was du programmierst - nicht das, was du willst.
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Yanbel“ ()