USB COMPorts detektieren: ManagementEventWatcher Event kommt 2x

  • VB.NET

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    USB COMPorts detektieren: ManagementEventWatcher Event kommt 2x

    Hallo,
    ich habe VB.NET 2010 Programm, mit dem ich das hinzufügen und entfernen von USB COMPorts detektiere.
    Das funktioniert soweit auch ganz gut, nur wird aus mir unerfindlichen Gründen der ManagementEventWatcher Event 2x ausgelöst.
    Ich habs nun schon 100x debugged, aber ich komme nicht drauf, wo der Fehler liegt. Vielleicht kann mir jemand auf die Sprünge helfen?

    Gruß
    Michael

    VB.NET-Quellcode

    1. Public Class MainForm
    2. Private Shared w As ManagementEventWatcher = Nothing ' AddRemoveUSBHandler()


    VB.NET-Quellcode

    1. Public Sub New()
    2. AddInsetUSBHandler()
    3. AddRemoveUSBHandler()
    4. End Sub



    VB.NET-Quellcode

    1. ' ####################### USB inserted/removed ##########################################
    2. Private Sub AddRemoveUSBHandler()
    3. Dim q As WqlEventQuery
    4. Dim scope As New ManagementScope("root\CIMV2")
    5. scope.Options.EnablePrivileges = True
    6. Try
    7. q = New WqlEventQuery()
    8. q.EventClassName = "__InstanceDeletionEvent"
    9. q.WithinInterval = New TimeSpan(0, 0, 3)
    10. q.Condition = "TargetInstance ISA 'Win32_USBControllerdevice'"
    11. w = New ManagementEventWatcher(scope, q)
    12. AddHandler w.EventArrived, AddressOf USBRemoved
    13. w.Start()
    14. Catch e As Exception
    15. If w IsNot Nothing Then
    16. w.Stop()
    17. End If
    18. End Try
    19. End Sub
    20. Private Sub AddInsetUSBHandler()
    21. Dim q As WqlEventQuery
    22. Dim scope As New ManagementScope("root\CIMV2")
    23. scope.Options.EnablePrivileges = True
    24. Try
    25. q = New WqlEventQuery()
    26. q.EventClassName = "__InstanceCreationEvent"
    27. q.WithinInterval = New TimeSpan(0, 0, 3)
    28. q.Condition = "TargetInstance ISA 'Win32_USBControllerdevice'"
    29. w = New ManagementEventWatcher(scope, q)
    30. AddHandler w.EventArrived, AddressOf USBAdded
    31. w.Start()
    32. Catch e As Exception
    33. If w IsNot Nothing Then
    34. w.Stop()
    35. End If
    36. End Try
    37. End Sub
    38. Public Sub USBAdded(ByVal sender As Object, ByVal e As EventArgs)
    39. TryCast(sender, ManagementEventWatcher).Stop()
    40. Dim RTBText As String = "USB hinzugefügt" & vbNewLine ' den anzuzeigenden Text erzeugen.
    41. If RichTextBox1.InvokeRequired Then ' Da die Daten aus einem anderem Thread kommen müssen wir die Ausgabe über Invoke machen.
    42. RichTextBox1.Invoke(New UpdateTextHandler(AddressOf UpdateControl), RichTextBox1, RTBText)
    43. Else
    44. UpdateControl(RichTextBox1, RTBText) 'Meldungstext zu Textbox hinzufügen.
    45. End If
    46. TryCast(sender, ManagementEventWatcher).Start()
    47. End Sub
    48. ' Public Shared Sub USBRemoved(ByVal sender As Object, ByVal e As EventArgs)
    49. Public Sub USBRemoved(ByVal sender As Object, ByVal e As EventArgs)
    50. TryCast(sender, ManagementEventWatcher).Stop()
    51. Dim RTBText As String = "Lightblock entfernt" & vbNewLine ' den anzuzeigenden Text erzeugen.
    52. If RichTextBox1.InvokeRequired Then ' Da die Daten aus einem anderem Thread kommen müssen wir die Ausgabe über Invoke machen.
    53. RichTextBox1.Invoke(New UpdateTextHandler(AddressOf UpdateControl), RichTextBox1, RTBText)
    54. Else
    55. UpdateControl(RichTextBox1, RTBText) 'Meldungstext zu Textbox hinzufügen.
    56. End If
    57. TryCast(sender, ManagementEventWatcher).Start()
    58. End Sub
    59. ' *** Procedur im Main Thread um auf die Contols treadübergreifend zuzugreifen.
    60. Private Sub UpdateControl(ByVal MyRichTextBox1 As RichTextBox, ByVal Text As String)
    61. RichTextBox1.AppendText(Text) 'Meldungstext zu Textbox hinzufügen.
    62. RichTextBox1.Refresh()
    63. End Sub
    Willkommen im Forum. :thumbup:

    buddhafragt schrieb:

    2x ausgelöst
    Ich bin mir nicht sicher, ob der Event 2 Mal ausgelöst wird oder ob Du den einmal ausgelösten Event 2 Mal anzeigst.
    Schmeiß mal Deinen RichTextBox-Zugriff raus und mach das ganze so:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub AppendText(txt As String)
    2. If Me.InvokeRequired Then
    3. ' ruft sich selbst auf
    4. Dim act As Action(Of String) = New Action(Of String)(AddressOf Me.AppendText)
    5. Me.BeginInvoke(act, txt)
    6. Return
    7. End If
    8. Me.RichTextBox1.AppendText(txt)
    9. Me.RichTextBox1.Refresh()
    10. End Sub
    Dann solltest Du den ManagementEventWatcher nicht stoppen und starten, sondern weiterlaufen lassen (kann sein, dass dies das 2. Event auslöst).
    Du kannst Code so blockieren:

    VB.NET-Quellcode

    1. Private o As New Object
    2. Private Sub DoIt()
    3. SyncLock (o)
    4. ' hier alles reinpacken
    5. End SyncLock
    6. End Sub
    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!
    Hallo Rod,
    besten Dank für den Code, habs implementiert und läuft... nur leider wird der Event immer noch 2x ausgelöst!
    Mit debug.writeLine anstatt der RTB dasselbe Ergebnis. ;(

    Was mir auch nicht so ganz klar ist: Wenn ich meinen USB Comport abziehe ohne ihn vorher zu schließen, sollte der Port dann ,vom Betriebssystem aus gesehen, gleich wieder frei sein...?
    Wenn ich das mal polle, ist er manchmal gleich frei, manchmal nach 10 Sekunden und dann wieder überhauptnichtmehr!
    Ist da Port.Dispose() hilfreich??


    Gruß Michael

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „buddhafragt“ ()

    buddhafragt schrieb:

    Port.Dispose()
    bringt nix.
    Poste mal Deinen neuen Code.
    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!