Übungsaufgabe FlipFlop

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 62 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Übungsaufgabe FlipFlop

    Moin moin

    Ich hatte eine Übungsaufgabe.
    Erstellen eines FlipFlop. Ich habe nun zwei Lösungen erstellt.

    Lösung 1: Mittels Timer und TimerTick
    Lösung 2: Mittels ThreadSleep

    Das mit dem Timer ging recht flott aber beim ThreadSleep habe ich lange gebraucht. Erst ging immer nur ein Status / Zustand, dann hing das Programm. Dabei kam ich dann auf die Idee mit dem Async.

    Jetzt meine Frage:
    Warum läuft das mit dem Timer so durch und mit dem ThreadSleep nur in einem Async-Modus?
    Was kann man ggf an dem Code verbessern?



    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class frm_flipflop
    2. Dim flipflop As Boolean = False
    3. Dim flipflop2 As Boolean = False
    4. Dim abort As Boolean
    5. Dim flop As Boolean
    6. Private Sub frm_flipflop_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    7. on_off(False) : settings()
    8. End Sub
    9. Private Sub settings()
    10. Timer1.Stop() : Timer1.Interval = 300
    11. pn_red.BackColor = Color.Red : pn_green.BackColor = Color.Green
    12. pn_red.Visible = False : pn_green.Visible = False
    13. lbl_tith.Text = "FilpFlop via TimerTick"
    14. End Sub
    15. Private Sub btn_onoff_Click(sender As Object, e As EventArgs) Handles btn_onoff.Click
    16. flipflop = Not flipflop
    17. on_off(flipflop)
    18. End Sub
    19. Private Sub on_off(ByVal flipflop As Boolean)
    20. If flipflop = True Then
    21. lbl_onoff.Text = "FlipFlop Ein"
    22. btn_onoff.BackColor = Color.Red
    23. Chb.Enabled = False
    24. abort = False
    25. If Chb.Checked = True Then
    26. flippAsync()
    27. Else
    28. Timer1.Start()
    29. End If
    30. Else
    31. abort = True
    32. lbl_onoff.Text = "FlipFlop Aus"
    33. btn_onoff.BackColor = Color.Green
    34. Chb.Enabled = True
    35. settings()
    36. End If
    37. End Sub
    38. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    39. flipflop2 = Not flipflop2
    40. If flipflop2 Then pn_red.Visible = True Else pn_red.Visible = False
    41. If flipflop2 Then pn_green.Visible = False Else pn_green.Visible = True
    42. End Sub
    43. Private Async Sub flippAsync()
    44. Await Threading.Tasks.Task.Run(Sub() display(True))
    45. abort = False
    46. settings()
    47. End Sub
    48. Private Sub display(ByVal flop As Boolean)
    49. If abort Then Exit Sub
    50. Threading.Thread.Sleep(500)
    51. If flop Then Me.BeginInvoke(Sub() pn_red.Visible = True) Else Me.BeginInvoke(Sub() pn_red.Visible = False)
    52. If flop Then Me.BeginInvoke(Sub() pn_green.Visible = False) Else Me.BeginInvoke(Sub() pn_green.Visible = True)
    53. flop = Not flop
    54. display(flop)
    55. End Sub
    56. Private Sub Chb_CheckedChanged(sender As Object, e As EventArgs) Handles Chb.CheckedChanged
    57. If Chb.Checked Then lbl_tith.Text = "FilpFlop via ThreadingThread" Else lbl_tith.Text = "FilpFlop via TimerTick"
    58. End Sub
    59. End Class

    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Hey Amelie, kurze Verständnisfrage. Ich verstehe unter FlipFlop:
    • Zustand 1 soll genauso lang andauern wie Zustand 2
    • man kann die Zeitdauern jedoch einstellen
    • das Ganze arbeitet von alleine, das heißt, ohne bestimmte Auslösung (etwas passiert am PC oder ein Button wird gedrückt) / ohne berührt zu werden
    Also so wie in der Elektrotechnik "ein 555-Timer in astable mode von allein läuft und Zustand 1 genauso lang ist wie Zustand 2, aber man kann es einstellen". Ist das dein Ziel?




    Vergleiche mit Booleans sind redundant.

    VB.NET-Quellcode

    1. If flipflop = True Then

    Besser ist:

    VB.NET-Quellcode

    1. If flipflop Then


    Weil du sonst fragst, ob es True ist, dass True = True ist
    If flipflop Then Das vergesse ich immer das es auch ohne die = geht. ;)

    Im Moment kann man die Zeitintervalle ( welche ja gleich sind ) halt nur im Code einstellen. Wäre ja leicht umzuändern.
    Hmm ohne eine Auslöäsung? Gibt es nicht für alles eine Bestimmte Auslösung? Z.B. an die Elektronik Strom dran machen?
    Ansonsten könnte ich den Button weg lassen und es aus dem FormLoad starten.

    EDIT:

    Ich versuche gerade ein Array mittels Timer auszulesen. Bräuchte da mal Hilfe. ;)
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Amelie schrieb:

    Warum läuft das mit dem Timer so durch und mit dem ThreadSleep nur in einem Async-Modus?
    Sleep() hält den Thread an, in dem es läuft.
    Dein Programm läuft also in zwei Threads, dem GUI-Thread und dem Sleep-Thread. Das ist nicht zielführend.
    Mit dem Timer-Tick bist Du auf der richtigen Seite, Dein Programm läuft nur im GUI-Thread, die Belastung durch das "Ticken" ist marginal.
    Dies ist die richtige Lösung.
    ====
    Dier Länge des Wartens kannst Du mit einem oder zwei NumericUpDown-Controls vorgeben.
    Wenn Du die Dauern in einem Array ablegst, kannst Du den Index mit einem NumericUpDown-Control vorgeben.

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @Bartosz
    Wenn ich den Button einmal drücke läuft das FlipFlp solange bis ich den Button erneut drücke.

    @RodFromGermany
    OK habe ich verstanden.

    Das mit dem Array auslesen ist etwas anderes. Das will ich auslesen, jede Sec ein neuer druchlauf der For Schleife...
    hänge gerade wie ich das in den Timer_Tick bekomme.


    OK Das habe ich hinbekommen.
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Amelie“ ()

    Brauche mal Hilfe für das Rückwärts auslesen.
    Vorwärts klappt es so wie ich wollte. Ein Panel nach dem anderen wecheslt die Farbe.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim panels() As Integer = New Integer() {1, 2, 3, 4, 5, 6}
    2. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    3. If abort Then Exit Sub
    4. If zaehler < panels.Length Then
    5. For i As Integer = 0 To panels.Length - 1
    6. Dim pan As Integer = panels(i)
    7. lbl_led.Text = panels(zaehler).ToString
    8. Dim x As Integer = panels(zaehler)
    9. Me.Controls("Panel" & x).BackColor = Color.Red
    10. If x > 1 Then
    11. Me.Controls("Panel" & x - 1).BackColor = Color.Maroon
    12. End If
    13. Next
    14. zaehler = zaehler + 1
    15. Else
    16. '<====== Rückwärts ... Zahle sind richtig aber bei den Farben hausts durcheinander
    17. zaehler = 0
    18. Array.Reverse(panels, 1, 5)
    19. For i As Integer = 0 To panels.Length - 1
    20. Dim pan As Integer = panels(i)
    21. lbl_led.Text = panels(zaehler).ToString
    22. Dim x As Integer = panels(i)
    23. Me.Controls("Panel" & x).BackColor = Color.Red
    24. If x < 6 Then
    25. Me.Controls("Panel" & x).BackColor = Color.Maroon
    26. End If
    27. Next
    28. zaehler = zaehler + 1
    29. End If
    30. End Sub
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

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

    Amelie schrieb:

    VB.NET-Quellcode

    1. Array.Reverse(panels, 1, 5)
    Was ganz genau tut genau dieser Befehl?
    Setze auf die Zeile danach einen Haltepunkt und sieh Dir das Array panels an. ;)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Moin moin
    Irgendwie bekomme ich das mit der Anzeige nicht hin.
    Zwar läuft es teilweise aber eben nicht richtig. lbl_led zählt richtig: Vor und Zurück
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    2. 'If abort Then Exit Sub
    3. If zaehler < panels.Length Then
    4. For i As Integer = 0 To panels.Length - 1
    5. Dim pan As Integer = panels(i)
    6. ' zählt richtig
    7. lbl_led.Text = panels(zaehler).ToString
    8. Dim x As Integer = panels(zaehler)
    9. Me.Controls("Panel" & x).BackColor = Color.Red
    10. If x > 1 Then
    11. Me.Controls("Panel" & x - 1).BackColor = Color.Maroon
    12. End If
    13. Next
    14. ElseIf zaehler = panels.Length Then
    15. Me.Controls("Panel" & zaehler).BackColor = Color.Maroon
    16. Array.Reverse(panels)
    17. For i As Integer = 0 To zaehler
    18. If zaehler < panels.Length Then
    19. ' <===== Im Einzelschritt zeigt der zaehler die richtigen Werte an.
    20. ' <===== läuft das Prog normal zeit das Label immer 0 an!
    21. lbl_zaehler.Text = CStr(zaehler)
    22. End If
    23. zaehler = zaehler - 1
    24. Next
    25. End If
    26. zaehler = zaehler + 1
    27. End Sub
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

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

    Amelie schrieb:

    VB.NET-Quellcode

    1. Array.Reverse(panels)
    Hausaufgaben gemacht? ;)

    Amelie schrieb:

    VB.NET-Quellcode

    1. zaehler = zaehler - 1
    2. Next
    3. End If
    4. zaehler = zaehler + 1
    Das dürfte beim Rückwärts zählen daneben gehen.
    Warum zählst Du nicht rückwärts, indem Du den Index von hinten an zählst, da musst Du das Array nicht umkehren.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hausaufgaben : Ja habe ich gemacht.
    Man kann hat bestimmen ob z.B. erst ab Stelle X umgedreht wird. usw...
    --
    ​Warum zählst Du nicht rückwärts, indem Du den Index von hinten an zählst, da musst Du das Array nicht umkehren.
    Wie stelle ich das an?
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Amelie schrieb:

    Wie stelle ich das an?

    VB.NET-Quellcode

    1. For i As Integer = 0 To panels.Length - 1
    2. Dim pan As Integer = panels(i)
    3. Dim pan2 As Integer = panels(panels.Length - 1 - i)
    4. ' ...
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Moin moin

    So habe meine Übung #2 Fertig. Erweiterung des FlipFlops.
    Ein Marquee-Lauflicht, Startbar von Links oder rechts.

    Was geht besser zu machen?

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class frm_lauflicht
    2. Dim t_clock As Boolean = False
    3. Dim flipflop As Boolean = False
    4. Dim abort As Boolean
    5. Dim forward As Boolean
    6. Dim backward As Boolean
    7. Dim zaehler As Integer
    8. Dim zaehlerforward As Integer
    9. Dim start As Integer = 0
    10. Dim ende As Integer = 5
    11. Private Sub frm_lauflicht_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    12. settings()
    13. End Sub
    14. Private Sub Timer1_Tick(Timer As Object, e As EventArgs) Handles Timer1.Tick
    15. If abort Then Exit Sub
    16. t_clock = Not t_clock
    17. If backward = True Then
    18. If t_clock Then
    19. If zaehler = ende Then Me.Controls("Panel" & ende).BackColor = Color.Red
    20. Dim x As Integer = zaehler
    21. lbl_zaehler2.Text = "Zählerstand: " & x.ToString
    22. zaehler = zaehler - 1
    23. If x = start Then backward = False : zaehlerforward = start : forward = True
    24. Me.Controls("Panel" & x).BackColor = Color.Red
    25. If x > start And x <> 5 Then Me.Controls("Panel" & x + 1).BackColor = Color.Maroon
    26. If x = start Then Me.Controls("Panel" & start + 1).BackColor = Color.Maroon
    27. If x = start Then forward = True
    28. End If
    29. ElseIf forward = True Then
    30. If t_clock Then
    31. Dim x As Integer = zaehlerforward
    32. lbl_zaehler_forward.Text = "Zählerstand: " & x.ToString
    33. zaehlerforward = zaehlerforward + 1
    34. Me.Controls("Panel" & x).BackColor = Color.Red
    35. If x > start Then Me.Controls("Panel" & x - 1).BackColor = Color.Maroon
    36. If x = ende Then backward = True : zaehler = ende
    37. End If
    38. End If
    39. End Sub
    40. Private Sub on_off(ByVal flipflop As Boolean)
    41. If flipflop Then
    42. btn_onoff.BackColor = Color.Red
    43. abort = False
    44. If cb_l2r.Checked Then
    45. backward = True : forward = False
    46. Else
    47. forward = True : backward = False
    48. End If
    49. Timer1.Start()
    50. Else
    51. Timer1.Dispose()
    52. abort = True
    53. btn_onoff.BackColor = Color.Green
    54. settings()
    55. End If
    56. End Sub
    57. Private Sub settings()
    58. For Each PN In Me.Controls.OfType(Of Panel)()
    59. PN.BackColor = Color.Maroon
    60. Next
    61. Timer1.Interval = 50
    62. zaehler = ende
    63. zaehlerforward = start
    64. lbl_zaehler_forward.Text = "Zählerstand: " : lbl_zaehler2.Text = "Zählerstand: "
    65. End Sub
    66. Private Sub btn_onoff_Click(slastLEDr As Object, e As EventArgs) Handles btn_onoff.Click
    67. flipflop = Not flipflop
    68. on_off(flipflop)
    69. End Sub
    70. End Class

    Bilder
    • lauflicht-1.jpg

      39,68 kB, 383×139, 80 mal angesehen
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

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

    Warum gibts da zwei Label, wo "Zählerstand" drauf steht?

    Das sollte auch im Code erkennbar sein, dass und warum da iwie zwei Zähler bespielt werden.

    Ansonsten ist der Zweck folgender Variablen nicht sofort und nicht sicher ersichtlich:

    VB.NET-Quellcode

    1. Dim t_clock As Boolean = False ' unklar
    2. Dim flipflop As Boolean = False ' unklar
    3. Dim abort As Boolean
    4. Dim forward As Boolean
    5. Dim backward As Boolean ' ist das niht einfach nur das Gegenteil von forward?
    6. Dim zaehler As Integer
    7. Dim zaehlerforward As Integer ' unklar
    8. Dim start As Integer = 0
    9. Dim ende As Integer = 5
    Warum gibts da zwei Label, wo "Zählerstand" drauf steht?

    Könnte die Labels auch komplett weglassen. ;)

    VB.NET-Quellcode

    1. Dim t_clock As Boolean = False ' unklar '<==== Der Taktgeber
    2. Dim flipflop As Boolean = False ' unklar '<==== Wie besser benennen?
    3. Dim backward As Boolean ' ist das niht einfach nur das Gegenteil von forward?
    4. 'Versteh nicht was du damit sagen willst.????
    5. Dim zaehlerforward As Integer ' unklar '<==== Warum unklar??
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Quellcode

    1. If cb_l2r.Checked Then
    2. backward = True : forward = False
    3. Else
    4. forward = True : backward = False
    5. End If

    Boolean-Vergleiche mit True sind überflüssig: gleich im ersten Post steht, warum ein solches If-Konstrukt total Banane ist.

    backward und forward sind zwei Seiten einer Medaille. Daher kann eines davon weg.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    OK
    Geändert. Brauch ja nicht 2mal

    VB.NET-Quellcode

    1. ​If cb_l2r.Checked Then backward = True


    VB.NET-Quellcode

    1. If abort Then Exit Sub
    2. t_clock = Not t_clock
    3. If backward Then '<===== Hier auch geändert
    4. ..
    5. .....
    6. End If
    7. Else '<====== Hier auch geändert
    8. If t_clock Then
    9. Dim x As Integer
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    @RodFromGermany

    ​Dim pan2 As Integer = panels(panels.Length - 1 - i)
    Hier zu. Habe da einiges ausprobiert aber ich komme damit nicht klar.
    Im Einzelschritt wird mir zwar der letze Eintrag (Zahl) aus dem Array angezeigt aber ich hab keine Idee wie ich das umsetzen soll.

    VB.NET-Quellcode

    1. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    2. If zaehler < panels.Length Then
    3. For i As Integer = 0 To panels.Length - 1
    4. ' --------------> Dim pan As Integer = panels(i) <==Hat Null Auswirkung.
    5. Dim x As Integer = panels(zaehler)
    6. Me.Controls("Panel" & x).BackColor = Color.Red
    7. If x > 1 Then
    8. Me.Controls("Panel" & x - 1).BackColor = Color.Maroon
    9. End If
    10. Next
    11. End If
    12. zaehler = zaehler + 1
    13. If zaehler = panels.Length Then Timer1.Stop()
    14. End Sub
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    @Amelie Meine bescheidenen Anfängerkenntnisse sind leider für Deine höheren Aufgaben nicht gut genug.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!