PerformClick() funktioniert nur 4x

  • VB.NET

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von Lennart.

    PerformClick() funktioniert nur 4x

    Hallo und schönen Abend!
    Mein Glück im folgenden Code liegt darin das ich wenn ich die einzelnen
    Buttons (Button1001 oder Button1002... ) nacheinander drücke das Program funkt.
    Ich will mir aber einen Button schaffen der mir alle max 8 Buttons nacheinander drückt.
    Dies habe ich mit :

    VB.NET-Quellcode

    1. Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    2. Button1001.PerformClick()
    3. Button1002.PerformClick()
    4. Button1003.PerformClick()
    5. Button1004.PerformClick()
    6. Button1005.PerformClick()
    7. Button1006.PerformClick()
    8. Button1008.PerformClick()
    9. Button1029.PerformClick()
    10. End Sub


    dargestellt.
    Problem: Nach Button1004 ist Schluss.
    Deshalb habe ich das klicken auf die 8 Buttons in 2 Sub's geteilt mit je einem Auslöser-Button. 1-4 und 5-29
    Also Button1001 bis 1004 und 1005 bis 1029.

    Aber warum funkt das nicht für alle 8 Buttons ?
    Danke für Eure unterstützung
    Lennart



    VB.NET-Quellcode

    1. Imports System.IO.Ports
    2. Public Class Form1
    3. Dim RxData As String = ""
    4. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    5. SerialPort101.PortName = "com101"
    6. SerialPort101.BaudRate = 115200
    7. SerialPort101.DataBits = 8
    8. SerialPort101.Parity = Parity.None
    9. SerialPort101.StopBits = StopBits.One
    10. SerialPort101.Handshake = Handshake.None
    11. SerialPort101.Encoding = System.Text.Encoding.Default
    12. SerialPort101.Open()
    13. SerialPort101.Write("<1>") 'ein
    14. Timer1.Start()
    15. End Sub
    16. #Region "Lok ansprechen"
    17. Private Sub Button1001_Click(sender As Object, e As EventArgs) Handles Button1001.Click
    18. sendenCV1001()
    19. End Sub
    20. Sub sendenCV1001()
    21. SerialPort101.Write("<R 1 11111 22222>")
    22. End Sub
    23. Private Sub Button1002_Click(sender As Object, e As EventArgs) Handles Button1002.Click
    24. sendenCV1002()
    25. End Sub
    26. Sub sendenCV1002()
    27. SerialPort101.Write("<R 2 11111 22222>")
    28. End Sub
    29. Private Sub Button1003_Click(sender As Object, e As EventArgs) Handles Button1003.Click
    30. sendenCV1003()
    31. End Sub
    32. Sub sendenCV1003()
    33. SerialPort101.Write("<R 3 11111 22222>")
    34. End Sub
    35. Private Sub Button1004_Click(sender As Object, e As EventArgs) Handles Button1004.Click
    36. sendenCV1004()
    37. End Sub
    38. Sub sendenCV1004()
    39. SerialPort101.Write("<R 4 11111 22222>")
    40. End Sub
    41. Private Sub Button1005_Click(sender As Object, e As EventArgs) Handles Button1005.Click
    42. sendenCV1005()
    43. End Sub
    44. Sub sendenCV1005()
    45. SerialPort101.Write("<R 5 11111 22222>")
    46. End Sub
    47. Private Sub Button1006_Click(sender As Object, e As EventArgs) Handles Button1006.Click
    48. sendenCV1006()
    49. End Sub
    50. Sub sendenCV1006()
    51. SerialPort101.Write("<R 6 11111 22222>")
    52. End Sub
    53. Private Sub Button1008_Click(sender As Object, e As EventArgs) Handles Button1008.Click
    54. sendenCV1008()
    55. End Sub
    56. Sub sendenCV1008()
    57. SerialPort101.Write("<R 8 11111 22222>")
    58. End Sub
    59. Private Sub Button1029_Click(sender As Object, e As EventArgs) Handles Button1029.Click
    60. sendenCV1029()
    61. End Sub
    62. Sub sendenCV1029()
    63. SerialPort101.Write("<R 29 11111 22222>")
    64. End Sub
    65. #End Region
    66. '---------------------------------------------------------------------------------------------------------------------------------------------------
    67. '---------------------------------------------------------------------------------------------------------------------------------------------------
    68. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    69. Try
    70. RxData = ReceiveSerialData()
    71. Dim rxpacket As String() = RxData.Split(",") 'Ende der übertragenen Zeichenkette
    72. Dim rxprams As String() = rxpacket(0).Split(":") 'Zeichenkette teilen bei :
    73. RichTextBox1.AppendText(Environment.NewLine & "CV:" & rxprams(0) & " = " & rxprams(1))
    74. If rxprams(0).Contains("-1-") Then
    75. Label1.Text = rxprams(1)
    76. End If
    77. If rxprams(0).Contains("-2-") Then
    78. Label2.Text = rxprams(1)
    79. End If
    80. If rxprams(0).Contains("-3-") Then
    81. Label3.Text = rxprams(1)
    82. End If
    83. If rxprams(0).Contains("-4-") Then
    84. Label4.Text = rxprams(1)
    85. End If
    86. If rxprams(0).Contains("-5-") Then
    87. Label5.Text = rxprams(1)
    88. End If
    89. If rxprams(0).Contains("-6-") Then
    90. Label6.Text = rxprams(1)
    91. End If
    92. If rxprams(0).Contains("-8-") Then
    93. Label7.Text = rxprams(1)
    94. End If
    95. If rxprams(0).Contains("-29-") Then
    96. Label8.Text = rxprams(1)
    97. End If
    98. Catch ex As Exception
    99. End Try
    100. End Sub
    101. Function ReceiveSerialData() As String
    102. Dim Incoming As String
    103. Try
    104. Incoming = SerialPort101.ReadExisting()
    105. If Incoming Is Nothing Then
    106. Return "no-data" & vbCrLf
    107. Else
    108. Return Incoming
    109. End If
    110. Catch ex As TimeoutException
    111. Return "Error: Serial Port timeout."
    112. End Try
    113. End Function
    114. '---------------------------------------------------------------------------------------------------------------------------------------------------
    115. '---------------------------------------------------------------------------------------------------------------------------------------------------
    116. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    117. Button1001.PerformClick()
    118. Button1002.PerformClick()
    119. Button1003.PerformClick()
    120. Button1004.PerformClick()
    121. End Sub
    122. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    123. Button1005.PerformClick()
    124. Button1006.PerformClick()
    125. Button1008.PerformClick()
    126. Button1029.PerformClick()
    127. End Sub
    128. Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    129. Button1001.PerformClick()
    130. Button1002.PerformClick()
    131. Button1003.PerformClick()
    132. Button1004.PerformClick()
    133. Button1005.PerformClick()
    134. Button1006.PerformClick()
    135. Button1008.PerformClick()
    136. Button1029.PerformClick()
    137. End Sub
    138. End Class

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

    Habe bisher noch nie eine Situation außerhalb von projektinterner UI-Automation gesehen, in der Button.PerformClick (oder die Variante von Cheffboss) irgendeinen Sinn ergibt.
    Wie wär's stattdessen einfach mal mit

    VB.NET-Quellcode

    1. Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    2. sendenCV1001()
    3. sendenCV1002()
    4. sendenCV1003()
    5. sendenCV1004()
    6. sendenCV1005()
    7. sendenCV1006()
    8. sendenCV1008()
    9. sendenCV1029()
    10. End Sub

    Das aber nur als 1. Schritt. Schau doch mal, ob das schon was verändert.
    Allerdings glaube ich, dass die enggetaktete Abfolge der Datensendungen Dir da einen Strich durch die Recnung macht. Vielleicht kommt der Empfänger mit der Menge an Signalen einfach nicht hinterher. Oder die Antworten überlagern sich und einige werden verschluckt.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Das sieht mir ehrlich gesagt eher nach einer falsch konzipierten UI aus. Davon abgesehen, dass die Benennungen der Buttons gar nicht aussagekräftig sind. Oder kannst Du mir ohne zu schauen sagen, was Button 1001 macht?

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

    Neu

    Lennart schrieb:

    Nach Button1004 ist Schluss.
    Wie genau äußert sich das?
    Wenn Du mit einer Hardware kommunizierst, sollte die Hardware den Takt vorgeben.
    Wenn Du den 5. Befehl sendest und der dritte ist noch nicht verarbeitet wird es Probleme geben.
    Zum Vorschlag von @Cheffboss Das funktioniert dann, wenn die Button disabled sind, da funktioniert .PerformClick() nämlich nicht.
    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!

    Neu

    Hallo RodFromGermany, Ich kommuniziere mit mit einem ArduinoMega, der hat noch eine Zusatzhardware drauf um aus einer in einer Lokomotive befindlichen Platine Informationen rauszuholen.
    Es ist ein langsam funktionirender Prozess. Klicke ich zB. Button1001 sende ich bis in die Lok hinein einen Befehl z.B.: "SerialPort101.Write("<R 1 11111 22222>") , dann dauert es schon mal 1-2 Sekunden bis ich "Antwort zurück erhalten habe. Diese ist dan dann schnell ge"splittet", in die Labels gebracht,... .
    Zu deiner Frage: Wie genau äußert sich das? : Ich klicke auf den Button3. Dann kommen im ca Sekundentakt die Ergebnisse für Button1001, 1002, 1003, 1004, und dann passiert gar nichts mehr. Würde ich händisch von 1001 bis 1029 durchklicken funktioniert es Problemlos , ich darf nur NICHT zu schnell klicken, dann ist auch irgendwo zwischendurch schluss. Wenn ich zwischen den einzelnen Button-clicks 1-2 Sekunden Abstand lasse funkt's super. In die Hardware kann ich nicht eingreifen um da Pause einzulegen.

    Neu

    Na dann nutze ggf. klassisch Threading.Thread.Sleep(DeinePauseInMillisenkunden)* oder Async/Await zwischen den Aufrufen, damit Du nicht zu schnell sendest.

    *dann schläft/hängt aber auch Deine App

    btw: Wenn Du weißt, wo genau das Problem liegt (und so klingt Post#8), dann gehört sowas in Post#1! Sonst rätseln wir rum und schließen dann auf die mögliche Problemursache (s. z.B. Post#3, letzter Abschnitt), die Dir aber schon längst bekannt ist.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.

    Neu

    @VaporiZed Jou.
    @Lennart Denk mal über eine Prozedur folgenden Namens nach:
    Function SendCommandWait4Answer(command As String) As String
    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!

    Neu

    Hallo Beitragende,
    vorab: Problem gelöst, ich habe auf den Vorschlag von VaporiZed hin weitergearbeitet und mit
    Pausen von 1500ms das absolut beste Ergebniss erziehlt. Ich habe schon 100'rte Durchläufe hintermir,
    es gab kein einziges Mal Probleme.
    Viele Dank auch an RodFromGermany, SendCommandandWait4Answer war der richtige Gedankenanstoß.
    Vielen Dank auch an die Anderen.
    Gruß
    Lennart

    Neu

    Thread.Sleep würde ich nicht verwenden.
    Du hast doch die möglichkeit mit

    VB.NET-Quellcode

    1. SerialPort101.WriteTimeout = 1000

    eine Zeit einzustellen. Dann brauchst du auch nur ein Button

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    2. SerialPort101.Write("<R 1 11111 22222>")
    3. SerialPort101.WriteTimeout = 1000
    4. SerialPort101.Write("<R 2 11111 22222>")
    5. SerialPort101.WriteTimeout = 1000
    6. 'etc...
    7. End Sub


    musst halt experimentieren welche Zeit da einzustellen ist

    gruss

    Neu

    @Kasi What :?:
    Was hat das Problem mit SerialPort.WriteTimeout zu tun?
    docs.microsoft.com/de-de/dotne…?view=dotnet-plat-ext-3.1
    Das Problem liegt darin, dass der nächste Befehl geschickt wird, bevor der eine fertig bearbeitet ist.
    Das wird im synchronen Fall mit einem Sleep() organisiert.
    Asynchron müsste eine Queue mit den Befehlen befüllt werden, wo nach Eingang der Bestätigung vom Gerät der nächste Befehl an das Gerät gesendet wird.
    Dazu wäre dann das SerialPort.DataReceived-Event zu verwenden.
    ====
    Und:
    Ändert sich der WriteTimeout-Wert zwischen den Schreib-Befehlen?
    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!

    Neu

    Also zur Samstagabendlichen Entspannung: so läuft das jetzt perfekt mit dem abfragen aller Buttons nacheinander

    VB.NET-Quellcode

    1. Private Sub ButtonALLE1_Click(sender As Object, e As EventArgs) Handles alleLESEN.Click
    2. SerialPort101.Write("<1>") 'ein
    3. Dim Wartezeit As Integer = (1000)
    4. sendenCV1001()
    5. sleep(Wartezeit) 'in Millisekunden angeben (1 sek = 1000 ms)
    6. sendenCV1002()
    7. sleep(Wartezeit) 'in Millisekunden angeben (1 sek = 1000 ms)
    8. sendenCV1003()
    9. sleep(Wartezeit) 'in Millisekunden angeben (1 sek = 1000 ms)
    10. sendenCV1004()
    11. sleep(Wartezeit) 'in Millisekunden angeben (1 sek = 1000 ms)
    12. sendenCV1005()
    13. sleep(Wartezeit) 'in Millisekunden angeben (1 sek = 1000 ms)
    14. sendenCV1006()
    15. sleep(Wartezeit) 'in Millisekunden angeben (1 sek = 1000 ms)


    vielen Dank nochmal !!!