Threading.Thread benutzerdefinierte Events auslösen

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von SpaceyX.

    Threading.Thread benutzerdefinierte Events auslösen

    Normalerweise arbeite ich sehr gerne mit dem BackgroundWorker. Jetzt möchte ich aber auch mal das ganze mit Threading.Thread probieren. Nun möchte ich gerne wissen, wie ich ohne RaiseEvent in dem Thread ein Event auslösen kann. Ich habe irgendwo mal gelesen, das ich das über den EventHandler machen kann
    ja das kannst du mit einem EventHandler machen, ist jedoch nicht zwingend notwendig, im Endeffekt kommt das ganze auf dasselbe raus...

    Hier ein Beispiel mit EventHandler:

    VB.NET-Quellcode

    1. Public Event Textgeändert(sender As System.Object,e As TextChangedEventArgs)
    2. Public Delegate Sub TextgeändertDel(sender As System.Object,e As TextChangedEventArgs)
    3. Public TextChangedEventArgs'oder was auch immer
    4. Inherits EventArgs
    5. Private m_Text As String
    6. Public ReadOnly Property Text() As String
    7. Get
    8. Return m_Text
    9. End Get
    10. End Property
    11. Sub New(Text As String)
    12. m_Text = Text
    13. End SUb
    14. End Class
    15. Private Sub Test_TextGeändert(sender As Object,e As TextChangedEventArgs)' Die Methode welche aufgerufen wird, wenn das Event ausgelöst wird...
    16. End Sub
    17. Sub AddEvent()'Muss irgendwann zu beginn ausgeführt werden(nicht im Thread)
    18. AddHandler Textgeändert, New TextGeändertDel(AddressOf Test_TextGeändert)
    19. End Sub
    20. Sub Thread()'wird im Thread ausgeführt
    21. RaiseEvent TextGeändert(Me,New TextChangedEventArgs("Text geändert"))
    22. End Sub

    und ohne:

    VB.NET-Quellcode

    1. Public Event Textgeändert(sender As System.Object,e As TextChangedEventArgs)
    2. Public Delegate Sub TextgeändertDelSub(sender As System.Object,e As TextChangedEventArgs)
    3. Sub TextgeändertDel(sender As System.Object,e As TextChangedEventArgs)
    4. RaiseEvent Textgeändert(sender,e)
    5. End Sub
    6. Public TextChangedEventArgs'oder was auch immer
    7. Inherits EventArgs
    8. Private m_Text As String
    9. Public ReadOnly Property Text() As String
    10. Get
    11. Return m_Text
    12. End Get
    13. End Property
    14. Sub New(Text As String)
    15. m_Text = Text
    16. End SUb
    17. End Class
    18. Private Sub Test_TextGeändert(sender As Object,e As TextChangedEventArgs)Handles TextGeändert' Die Methode welche aufgerufen wird, wenn das Event ausgelöst wird...
    19. End Sub
    20. Sub Thread()
    21. Me.Invoke(New TextgeändertDelSub(AddressOf TextgeändertDel),Me,"Text wurde geändert...")
    22. End Sub


    teils geht es evtl. noch geschickter ;)
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Also zuerst mal den Code.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Threading
    2. Public Class Form1
    3. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    4. Dim locItems As List(Of Item) = Nothing
    5. Dim locTest As Test = Nothing
    6. Dim locObjThread As Thread = Nothing
    7. Dim locItem As Item = Nothing
    8. locItems = New List(Of Item)
    9. locTest = New Test()
    10. AddHandler locTest.Log, AddressOf Test_Log
    11. locItem = New Item()
    12. locItem.Name = "Name"
    13. locItems.Add(locItem)
    14. locItem = New Item()
    15. locItem.Name = "Name 2"
    16. locItems.Add(locItem)
    17. locTest.Items = locItems
    18. locObjThread = New Thread(AddressOf locTest.Test)
    19. locObjThread.Start()
    20. End Sub
    21. Public Sub Test_Log(ByVal sText As Object)
    22. Me.TextBox1.Text &= CStr(sText)
    23. End Sub
    24. End Class
    25. Public Class Test
    26. Public Delegate Sub LogEventHandler(ByVal vStrText As String)
    27. Public Event Log As LogEventHandler
    28. Private pLstItems As List(Of Item)
    29. Public Property Items() As List(Of Item)
    30. Get
    31. Return Me.pLstItems
    32. End Get
    33. Set(ByVal value As List(Of Item))
    34. Me.pLstItems = value
    35. End Set
    36. End Property
    37. Public Sub New()
    38. Me.pLstItems = New List(Of Item)
    39. End Sub
    40. Public Sub Test()
    41. Dim locItem As Item = Nothing
    42. For Each locItem In Me.pLstItems
    43. RaiseEvent Log(locItem.Name)
    44. Next
    45. End Sub
    46. End Class
    47. Public Class Item
    48. Private locName As String
    49. Public Property Name() As String
    50. Get
    51. Return Me.locName
    52. End Get
    53. Set(ByVal value As String)
    54. Me.locName = value
    55. End Set
    56. End Property
    57. End Class



    Dann nochmal was und zwar befindet sich die Funktion die ich in einem anderen Thread ausführen möchte ich einer Klasse, die ich instanzieren muss.
    also ich will jetzt dir nicht alles vorcoden, schließlich willst du ja auch noch was machen :P

    aber ich hab dir hier ne Test-Klasse(der Thread ist jedoch Integriert....das kannst du aber auch noch ändern^^):

    VB.NET-Quellcode

    1. Public Class Test
    2. Public Delegate Sub TestedDel(ByVal e As String)
    3. Public Event Tested As TestedDel
    4. Private asyncOp As System.ComponentModel.AsyncOperation
    5. Sub New()
    6. asyncOp = System.ComponentModel.AsyncOperationManager.CreateOperation(Nothing)
    7. End Sub
    8. Public Sub Start()
    9. Dim tmp As New Thread(AddressOf Work)
    10. tmp.Start()
    11. End Sub
    12. Private Sub Work()
    13. Dim i As Integer
    14. While i < 1000
    15. asyncOp.Post(New SendOrPostCallback(AddressOf OnTestPost), "über" & i)
    16. System.Threading.Thread.Sleep(1000)
    17. i += 1
    18. End While
    19. End Sub
    20. Sub OnTestPost(ByVal obj As Object)
    21. OnTested(CStr(obj))
    22. End Sub
    23. Protected Overridable Sub OnTested(ByVal e As String)
    24. RaiseEvent Tested(e)
    25. End Sub
    26. End Class

    im Formular kann dieses nun mit WithEvents(oder auch AddHandler) verwendet werden, das Event "Tested" wird dabei wieder im Form Thread ausgeführt und e enthält einen String, welchen du an Controls übergeben kannst...

    P.S.: Konnte ich dir eigt. beim BackgroundWorker helfen? Es ist keine Antwort mehr gekommen?! :P
    Edit: ich meine hier:
    [VB.NET] BackgroundWorker erweitern
    und hier
    [VB.NET] Parameter aus einem String lesen und wenn nicht vorhanden standardwert vergeben
    evtl. noch hier
    [VB.NET] Welches Control?
    und hier
    [VB.NET] Prüfen ob ein XmlElement existiert

    :P
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---

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

    WithEvents verwenden?

    Hallo,

    kann mir jemand sagen wie genau ich das jetzt anstellen muss?
    im Formular kann dieses nun mit WithEvents(oder auch AddHandler) verwendet werden, das Event "Tested" wird dabei wieder im Form Thread ausgeführt und e enthält einen String, welchen du an Controls übergeben kannst...


    VB.NET-Quellcode

    1. Public Class Test
    2. Public Delegate Sub TestedDel(ByVal e As String)
    3. Public Event Tested As TestedDel
    4. Private asyncOp As System.ComponentModel.AsyncOperation
    5. Sub New()
    6. asyncOp = System.ComponentModel.AsyncOperationManager.CreateOperation(Nothing)
    7. End Sub
    8. Public Sub Start()
    9. Dim tmp As New Thread(AddressOf Work)
    10. tmp.Start()
    11. End Sub
    12. Private Sub Work()
    13. Dim i As Integer
    14. While i < 1000
    15. asyncOp.Post(New SendOrPostCallback(AddressOf OnTestPost), "über" & i)
    16. System.Threading.Thread.Sleep(1000)
    17. i += 1
    18. End While
    19. End Sub
    20. Sub OnTestPost(ByVal obj As Object)
    21. OnTested(CStr(obj))
    22. End Sub
    23. Protected Overridable Sub OnTested(ByVal e As String)
    24. RaiseEvent Tested(e)
    25. End Sub
    26. End Class
    o/ moin,

    @jvbsl

    darkman203 schrieb:

    asyncOp.Post(New SendOrPostCallback(AddressOf OnTestPost), "über" & i)


    danke, nach sowas hab ich schon lange gesucht. ich hatte sowas bisher immer im eventhandler der form per delegates an die controls übergeben :) sauber...

    @darkman203

    im code deiner form schreibst Du z. b. so:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private WithEvents t As New Test
    3. Private Sub t_Tested(e As String) Handles t.Tested
    4. Me.Text = e
    5. End Sub
    6. End Class


    den funktionsrumpf für den eventhandler erstellt Dir der code-editor automatisch, indem Du die auswahl der dropdown-liste links oben auf "t" änderst. in der dropdown-liste rechts daneben findest Du die events.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o