EDIT: Mit dem Framework 4.0 gehts auch so schon sehr einfach. s. Post weiter unten. Bei älteren FW ist es mit dieser Methode etwas weniger Schreibarbeit.
Vermutlich nicht ganz sauber, aber ...
In diesem Thread :
[VB 2010] Funktion per Thread starten.
hatte ich mal ne Idee und FatFire hat sich dann in einen an sich recht simplen Code gegossen.
Geht darum, dass immer wieder das Problem auftaucht, dass man aus einem Thread auf ein Control in einem anderen Thread zugreifen muss. Die Lösungen sind ja bekannt, aber je nachdem wie viele (verschiedene) Controls das betrifft, ist das manchmal ziemlich viel Schreibarbeit. Wenn man sich das schenken will und Performance nicht das Hauptkriterium ist, kann man es halt mit dem Code von FatFire lösen.
Leider ist FF derzeit nicht mehr hier unterwegs, und so kann ich ihn nicht fragen.
Da das ganze aber "auch" auf meinem Mist gewachsen ist hier noch mal der Code von FF, weil der sicherlich besser in DIESES Unterforum passt:
Spoiler anzeigen
EDIT: Auf Wunsch eines Herren ...
Kleines Beispiel:
Spoiler anzeigen
Vermutlich nicht ganz sauber, aber ...
In diesem Thread :
[VB 2010] Funktion per Thread starten.
hatte ich mal ne Idee und FatFire hat sich dann in einen an sich recht simplen Code gegossen.
Geht darum, dass immer wieder das Problem auftaucht, dass man aus einem Thread auf ein Control in einem anderen Thread zugreifen muss. Die Lösungen sind ja bekannt, aber je nachdem wie viele (verschiedene) Controls das betrifft, ist das manchmal ziemlich viel Schreibarbeit. Wenn man sich das schenken will und Performance nicht das Hauptkriterium ist, kann man es halt mit dem Code von FatFire lösen.
Leider ist FF derzeit nicht mehr hier unterwegs, und so kann ich ihn nicht fragen.
Da das ganze aber "auch" auf meinem Mist gewachsen ist hier noch mal der Code von FF, weil der sicherlich besser in DIESES Unterforum passt:
VB.NET-Quellcode
- Public Module GUIHelper
- Private Delegate Sub InvokeDelegateWOReturn(ByVal Control As System.Windows.Forms.Control, _
- ByVal Method As String, ByVal Flags As System. _
- Reflection.BindingFlags, ByVal Values As Object())
- Private Delegate Function InvokeDelegateWReturn(ByVal Control As System.Windows.Forms.Control, _
- ByVal Method As String, ByVal Flags As System. _
- Reflection.BindingFlags, ByVal Values As Object()) As Object
- Private SetSomethingDelegateInstance As New InvokeDelegateWOReturn(AddressOf SetSomething)
- Private GetSomethingDelegateInstance As New InvokeDelegateWReturn(AddressOf GetSomething)
- Private Sub SetSomething(ByVal Control As System.Windows.Forms.Control, ByVal Method As String, _
- ByVal Flags As System.Reflection.BindingFlags, ByVal Values As Object())
- If Control.InvokeRequired Then
- Control.Invoke(SetSomethingDelegateInstance, Control, Method, Flags, Values)
- Else
- Control.GetType.InvokeMember(Method, Flags, System.Type.DefaultBinder, Control, Values)
- End If
- End Sub
- Private Function GetSomething(ByVal Control As System.Windows.Forms.Control, ByVal Method As String, _
- ByVal Flags As System.Reflection.BindingFlags, ByVal Values As Object()) As Object
- If Control.InvokeRequired Then
- Return Control.Invoke(GetSomethingDelegateInstance, Control, Method, Flags, Values)
- Else
- Return Control.GetType.InvokeMember(Method, Flags, Nothing, Control, Values)
- End If
- End Function
- Public Sub SetProperty(ByVal Control As System.Windows.Forms.Control, ByVal Method As String, _
- ByVal ParamArray Values As Object())
- SetSomething(Control, Method, Reflection.BindingFlags.SetProperty, Values)
- End Sub
- Public Function GetProperty(ByVal Control As System.Windows.Forms.Control, ByVal Method As String, _
- ByVal ParamArray Values As Object()) As Object
- Return GetSomething(Control, Method, Reflection.BindingFlags.GetProperty, Values)
- End Function
- Public Function InvokeMethod(ByVal Control As System.Windows.Forms.Control, ByVal Method As String, _
- ByVal ParamArray Values As Object()) As Object
- Return GetSomething(Control, Method, Reflection.BindingFlags.InvokeMethod, Values)
- End Function
- Public Sub SetField(ByVal Control As System.Windows.Forms.Control, ByVal Method As String, _
- ByVal ParamArray Values As Object())
- SetSomething(Control, Method, Reflection.BindingFlags.SetField, Values)
- End Sub
- Public Function GetField(ByVal Control As System.Windows.Forms.Control, ByVal Method As String, _
- ByVal ParamArray Values As Object()) As Object
- Return GetSomething(Control, Method, Reflection.BindingFlags.GetField, Values)
- End Function
- End Module
EDIT: Auf Wunsch eines Herren ...
Kleines Beispiel:
VB.NET-Quellcode
- Public Class Form1
- Private Sub foo()
- Try
- TextBox1.Text = "Hallo"
- TextBox1.AppendText(" Welt")
- Catch ex As Exception
- MessageBox.Show(ex.Message)
- End Try
- End Sub
- Private Sub bar()
- ' Kein Fehler, wenn von einem anderen Thread aufgerufen!
- GUIHelper.SetProperty(TextBox1, "Text", "Hallo")
- GUIHelper.InvokeMethod(TextBox1, "AppendText", " Welt")
- End Sub
- Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
- ' löst einen Fehler in foo aus!
- Dim t As New Threading.Thread(AddressOf foo)
- t.Start()
- ' löst KEINEN Fehler aus!
- Dim s As New Threading.Thread(AddressOf bar)
- s.Start()
- End Sub
- End Class
Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „picoflop“ ()