Zähler mit Zeitvorgabe, von x bis y in xxx

  • VB.NET

Es gibt 47 Antworten in diesem Thema. Der letzte Beitrag () ist von wolfi_bayern.

    Dann wäre es wiederrum easy.

    EDIT: Jetzt mit Endless-Funktion

    Form

    VB.NET-Quellcode

    1. Public Einheit1 As Recheneinheit
    2. Public Einheit2 As Recheneinheit
    3. Private Sub btnStart_Click(sender As Object, e As EventArgs) Handles btnStart.Click
    4. Dim Zähler1 As New Recheneinheit
    5. Zähler1.Milliseconds = 5000
    6. Zähler1.Steps = 1270
    7. Zähler1.Typ = Recheneinheit.Zähltypen.EndlessCountDown
    8. Zähler1.AufrufendeForm = Me
    9. Einheit1 = Zähler1
    10. AddHandler Zähler1.NextStep, AddressOf NextStep
    11. Zähler1.Start()
    12. Dim Zähler2 As New Recheneinheit
    13. Zähler2.Milliseconds = 5000
    14. Zähler2.Steps = 1270
    15. Zähler2.Typ = Recheneinheit.Zähltypen.EndlessCountUp
    16. Zähler2.AufrufendeForm = Me
    17. Einheit2 = Zähler2
    18. AddHandler Zähler2.NextStep, AddressOf NextStep
    19. Zähler2.Start()
    20. End Sub
    21. Private Sub NextStep(Einheit As Recheneinheit, NextStep As Integer)
    22. Select Case Einheit.Identifier
    23. Case Einheit1.Identifier
    24. Label1.Text = NextStep.ToString
    25. Case Einheit2.Identifier
    26. Label2.Text = NextStep.ToString
    27. End Select
    28. End Sub
    29. Private Sub btnStop_Click(sender As Object, e As EventArgs) Handles btnStop.Click
    30. Einheit1.Cancel()
    31. Einheit2.Cancel()
    32. End Sub



    Klasse Recheneinheit

    VB.NET-Quellcode

    1. Public Class Recheneinheit
    2. Public Enum Zähltypen
    3. CountUp
    4. CountDown
    5. EndlessCountUp
    6. EndlessCountDown
    7. End Enum
    8. Public Property Identifier As Guid
    9. Public Property Milliseconds As Integer
    10. Public Property InitialMS As Integer
    11. Public Property AciveMS As Integer
    12. Public Property Value As Integer
    13. Public Property Steps As Integer
    14. Public Property Typ As Zähltypen
    15. Public Property AufrufendeForm As Form
    16. Private LastValue As Integer
    17. Public Event NextStep(Einheit As Recheneinheit, xStep As Integer)
    18. Public WithEvents IntervalTimer As New Timer
    19. Public Sub Start()
    20. Dim DN As Date = Date.Now
    21. InitialMS = DN.Minute * 60000 + DN.Second * 1000 + DN.Millisecond
    22. If Steps = 0 Then
    23. Steps = 1270
    24. End If
    25. If Typ = Nothing Then
    26. Typ = Zähltypen.CountUp
    27. End If
    28. LastValue = 0
    29. IntervalTimer.Interval = 1
    30. IntervalTimer.Start()
    31. End Sub
    32. Public Sub Timer_Tick(sender As Object, e As EventArgs) Handles IntervalTimer.Tick
    33. Dim DN As Date = Date.Now
    34. AciveMS = DN.Minute * 60000 + DN.Second * 1000 + DN.Millisecond
    35. Zählen(AciveMS - InitialMS)
    36. End Sub
    37. Private Sub Zählen(NewValue As Integer)
    38. Value = NewValue / Milliseconds * Steps
    39. Task.Factory.StartNew(Sub()
    40. Dim y As Integer = Math.Truncate(Value)
    41. For i = LastValue To y - 1
    42. If i < Steps AndAlso i > 0 Then
    43. Select Case Typ
    44. Case Zähltypen.CountUp, Zähltypen.EndlessCountUp
    45. AufrufendeForm.Invoke(Sub()
    46. RaiseEvent NextStep(Me, i)
    47. End Sub)
    48. Case Zähltypen.CountDown, Zähltypen.EndlessCountDown
    49. AufrufendeForm.Invoke(Sub()
    50. RaiseEvent NextStep(Me, Steps - i)
    51. End Sub)
    52. End Select
    53. ElseIf i >= Steps AndAlso Typ = Zähltypen.CountUp Then
    54. AufrufendeForm.Invoke(Sub()
    55. RaiseEvent NextStep(Me, Steps)
    56. End Sub)
    57. Exit Sub
    58. ElseIf (Steps - i) <= 0 AndAlso Typ = Zähltypen.CountDown Then
    59. AufrufendeForm.Invoke(Sub()
    60. RaiseEvent NextStep(Me, 0)
    61. End Sub)
    62. Exit Sub
    63. ElseIf i >= Steps AndAlso Typ = Zähltypen.EndlessCountUp Then
    64. Dim DN As Date = Date.Now
    65. InitialMS = DN.Minute * 60000 + DN.Second * 1000 + DN.Millisecond
    66. AufrufendeForm.Invoke(Sub()
    67. RaiseEvent NextStep(Me, Steps)
    68. End Sub)
    69. ElseIf (Steps - i) <= 0 AndAlso Typ = Zähltypen.EndlessCountDown Then
    70. Dim DN As Date = Date.Now
    71. InitialMS = DN.Minute * 60000 + DN.Second * 1000 + DN.Millisecond
    72. AufrufendeForm.Invoke(Sub()
    73. RaiseEvent NextStep(Me, 0)
    74. End Sub)
    75. End If
    76. Next
    77. LastValue = y
    78. End Sub)
    79. If (Value >= Steps OrElse Value <= 0) AndAlso Not Typ = Zähltypen.EndlessCountUp AndAlso Not Typ = Zähltypen.EndlessCountDown Then
    80. IntervalTimer.Stop()
    81. End If
    82. End Sub
    83. Public Sub Cancel()
    84. IntervalTimer.Stop()
    85. End Sub
    86. Public Sub New()
    87. Identifier = Guid.NewGuid
    88. End Sub
    89. 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“ ()

    Okay, ich schick dir meine Nummer per PN.

    Ansonsten hier noch eine Kurzanleitung:

    Was die Klasse Recheneinheit tut, das braucht dich nicht zu interessieren. Dich interessiert nur was in der Form steht:

    VB.NET-Quellcode

    1. Dim Zähler1 As New Recheneinheit 'Initialisierung der Klasse inkl. Gernerierung einer eindeutigen ID (Zähler1.Identifier)
    2. Zähler1.Milliseconds = 5000 'Hier stellst du die Laufzeit ein. In diesem Fall 5 Sekunden
    3. Zähler1.Steps = 1270' Hier stellst du ein, wieviele Steps er durchlaufen soll.
    4. Zähler1.Typ = Recheneinheit.Zähltypen.EndlessCountDown 'Hier weist du ihm zu, wie gezählt werden soll, in diesem Fall Zählt er endlos runter bis 0 und fängt dann wieder von vorne an
    5. Zähler1.AufrufendeForm = Me ' Der Aufruf ist zwingend notwendig. Einfach immer mit implementieren
    6. Identifier1 = Zähler1.Identifier.ToString ' Hier holst du dir für die spätere Zuweisung den Identifier
    7. AddHandler Zähler1.NextStep, AddressOf NextStep 'Hier sagst du dass dein deine Steps in dem Sub NextStep abgearbeitet werden sollen
    8. Zähler1.Start() ' Hier startest du den Timer


    Mit fällt gerade auf, dass ich noch einen Cancel-Button programmieren sollte um den Timer auch wieder anzuhalten :D

    VB.NET-Quellcode

    1. Private Sub NextStep(Einheit As Recheneinheit, NextStep As Integer)
    2. Select Case Einheit.Identifier.ToString
    3. Case Identifier1
    4. 'Hier kommt der Code rein, den Zähler1 abarbeiten soll
    5. Case Identifier2
    6. 'Hier kommt der Code rein, den Zähler2 abarbeiten soll
    7. End Select
    8. End Sub


    Ein Computer wird das tun, was du programmierst - nicht das, was du willst.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Yanbel“ ()

    Hallo!

    Ich hatte oben schon mal geschrieben und meine Vermutung, dass es um Licht geht war gar nicht so verkehrt.

    Ich denke es wäre auch interessant zu wissen wie die gewünschten Einstellwerte an das Lichtmischpult kommen... Denn die beste Loop hilft nichts, wenn die Datenübertragung viel länger benötigt.

    Als zweites würde ich vorschlagen, dass Du die jeweilige Funktion in einer eigenen Klasse darstellst mit den Werten Prozent-Start, Prozent-Ziel, Startwert, Endwert, Startzeit, isActive. Wenn Du das hast, dann kommt ja die Schnittstelle ins spiel. Da die Steuersignale vermutlich in einem Interval gesendet (?) werden könnte man eine Schleife über alle Regler machen, abfragen ob dieser aktiv ist und wenn ja abhängig von der Abgelaufenen Zeit den Steuerwert berechnen und übertragen (Dreisatz).

    Grüße
    Der Beitrag wurde aus 100% wiederverwendbaren Elektronen erstellt!
    @wolfi_bayernnull
    ​Wenn Du das hast, dann kommt ja die Schnittstelle ins spiel

    genau deshalb hab ich nicht sehr viel drüber gesagt, das sorgt alles für Verwirrung und Leute machen sich über Sachen Gedanken die überhaupt nicht zum Thema gehören !
    Das Programm läuft, es ist im Einsatz, es gab keinerlei Fragen was die Schnittstelle angeht und ob die Daten auch schnell genug beim "Master" ankommen !
    JA tun sie !
    Ich möchte nur das Programm optimieren wegen der CPU Last in meiner Version, NICHTS anderes !

    @Yanbel
    ich melde mich, gerade etwas stressig, viel zu tun....DANKE
    Mal ne blöde Frage - ist es zwingend notwendig, dass das ganze tatsächlich in 1er Schritten durchgeführt werden muss? Ich stelle mal die These auf, dass das menschliche Auge es nicht bemerkt, ob du jetzt alle 1,57ms die Helligkeit um einen Punkt erhöhst oder alle 15ms um 10 Punkte (plusminus 1, um die 0,7 auszugleichen, aber das ist ja mittels linearer Interpolation einfach auszurechnen).
    Twitch Viewer Display Chat-, Zuschauer- und Statistiktool für Streamer
    ​Mal ne blöde Frage - ist es zwingend notwendig, dass das ganze tatsächlich in 1er Schritten durchgeführt werden muss


    Ja, da Helligkeit nur ein Beispiel war, es geht viel mehr um Bewegung, und wenn es nicht wichtig wäre hätten wir uns nicht ewig den Kopf zerbrochen wie wir auf 1270 Schritte kommen, da hätten wir die Orginalen 127 Schritte genommen !