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
Threading.Thread benutzerdefinierte Events auslösen
- VB.NET
Sie verwenden einen veralteten Browser (%browser%) mit Sicherheitsschwachstellen und können nicht alle Funktionen dieser Webseite nutzen.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von SpaceyX.
-
-
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
- Public Event Textgeändert(sender As System.Object,e As TextChangedEventArgs)
- Public Delegate Sub TextgeändertDel(sender As System.Object,e As TextChangedEventArgs)
- Public TextChangedEventArgs'oder was auch immer
- Inherits EventArgs
- Private m_Text As String
- Public ReadOnly Property Text() As String
- Get
- Return m_Text
- End Get
- End Property
- Sub New(Text As String)
- m_Text = Text
- End SUb
- End Class
- Private Sub Test_TextGeändert(sender As Object,e As TextChangedEventArgs)' Die Methode welche aufgerufen wird, wenn das Event ausgelöst wird...
- End Sub
- Sub AddEvent()'Muss irgendwann zu beginn ausgeführt werden(nicht im Thread)
- AddHandler Textgeändert, New TextGeändertDel(AddressOf Test_TextGeändert)
- End Sub
- Sub Thread()'wird im Thread ausgeführt
- RaiseEvent TextGeändert(Me,New TextChangedEventArgs("Text geändert"))
- End Sub
und ohne:
VB.NET-Quellcode
- Public Event Textgeändert(sender As System.Object,e As TextChangedEventArgs)
- Public Delegate Sub TextgeändertDelSub(sender As System.Object,e As TextChangedEventArgs)
- Sub TextgeändertDel(sender As System.Object,e As TextChangedEventArgs)
- RaiseEvent Textgeändert(sender,e)
- End Sub
- Public TextChangedEventArgs'oder was auch immer
- Inherits EventArgs
- Private m_Text As String
- Public ReadOnly Property Text() As String
- Get
- Return m_Text
- End Get
- End Property
- Sub New(Text As String)
- m_Text = Text
- End SUb
- End Class
- 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...
- End Sub
- Sub Thread()
- Me.Invoke(New TextgeändertDelSub(AddressOf TextgeändertDel),Me,"Text wurde geändert...")
- End Sub
teils geht es evtl. noch geschickterIch wollte auch mal ne total überflüssige Signatur:
---Leer--- -
Also zuerst mal den Code.
Spoiler anzeigen
VB.NET-Quellcode
- Imports System.Threading
- Public Class Form1
- Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
- Dim locItems As List(Of Item) = Nothing
- Dim locTest As Test = Nothing
- Dim locObjThread As Thread = Nothing
- Dim locItem As Item = Nothing
- locItems = New List(Of Item)
- locTest = New Test()
- AddHandler locTest.Log, AddressOf Test_Log
- locItem = New Item()
- locItem.Name = "Name"
- locItems.Add(locItem)
- locItem = New Item()
- locItem.Name = "Name 2"
- locItems.Add(locItem)
- locTest.Items = locItems
- locObjThread = New Thread(AddressOf locTest.Test)
- locObjThread.Start()
- End Sub
- Public Sub Test_Log(ByVal sText As Object)
- Me.TextBox1.Text &= CStr(sText)
- End Sub
- End Class
- Public Class Test
- Public Delegate Sub LogEventHandler(ByVal vStrText As String)
- Public Event Log As LogEventHandler
- Private pLstItems As List(Of Item)
- Public Property Items() As List(Of Item)
- Get
- Return Me.pLstItems
- End Get
- Set(ByVal value As List(Of Item))
- Me.pLstItems = value
- End Set
- End Property
- Public Sub New()
- Me.pLstItems = New List(Of Item)
- End Sub
- Public Sub Test()
- Dim locItem As Item = Nothing
- For Each locItem In Me.pLstItems
- RaiseEvent Log(locItem.Name)
- Next
- End Sub
- End Class
- Public Class Item
- Private locName As String
- Public Property Name() As String
- Get
- Return Me.locName
- End Get
- Set(ByVal value As String)
- Me.locName = value
- End Set
- End Property
- 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
aber ich hab dir hier ne Test-Klasse(der Thread ist jedoch Integriert....das kannst du aber auch noch ändern^^):
VB.NET-Quellcode
- Public Class Test
- Public Delegate Sub TestedDel(ByVal e As String)
- Public Event Tested As TestedDel
- Private asyncOp As System.ComponentModel.AsyncOperation
- Sub New()
- asyncOp = System.ComponentModel.AsyncOperationManager.CreateOperation(Nothing)
- End Sub
- Public Sub Start()
- Dim tmp As New Thread(AddressOf Work)
- tmp.Start()
- End Sub
- Private Sub Work()
- Dim i As Integer
- While i < 1000
- asyncOp.Post(New SendOrPostCallback(AddressOf OnTestPost), "über" & i)
- System.Threading.Thread.Sleep(1000)
- i += 1
- End While
- End Sub
- Sub OnTestPost(ByVal obj As Object)
- OnTested(CStr(obj))
- End Sub
- Protected Overridable Sub OnTested(ByVal e As String)
- RaiseEvent Tested(e)
- End Sub
- 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?!
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
Ich wollte auch mal ne total überflüssige Signatur:
---Leer---Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „jvbsl“ ()
-
-
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
- Public Class Test
- Public Delegate Sub TestedDel(ByVal e As String)
- Public Event Tested As TestedDel
- Private asyncOp As System.ComponentModel.AsyncOperation
- Sub New()
- asyncOp = System.ComponentModel.AsyncOperationManager.CreateOperation(Nothing)
- End Sub
- Public Sub Start()
- Dim tmp As New Thread(AddressOf Work)
- tmp.Start()
- End Sub
- Private Sub Work()
- Dim i As Integer
- While i < 1000
- asyncOp.Post(New SendOrPostCallback(AddressOf OnTestPost), "über" & i)
- System.Threading.Thread.Sleep(1000)
- i += 1
- End While
- End Sub
- Sub OnTestPost(ByVal obj As Object)
- OnTested(CStr(obj))
- End Sub
- Protected Overridable Sub OnTested(ByVal e As String)
- RaiseEvent Tested(e)
- End Sub
- 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:
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.
-
Ähnliche Themen
-
Event einer Klasse empfangen - Wie?
Daniel Baumert - - Sonstige Problemstellungen
-
4 Benutzer haben hier geschrieben
- Gast (3)
- jvbsl (2)
- SpaceyX (1)
- darkman203 (1)