Funktion per Thread starten.
- 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 11 Antworten in diesem Thema. Der letzte Beitrag () ist von FatFire.
-
-
-
-
Parameter musst du beim Aufruf der Start-Methode übergeben.
Und CheckForIllegalCrossThreadCalls vergisst du mal ganz schnell wieder. ;) -
(Achtung, gleich meckern alle)
Wenn Du es weißt, warum...
1. empfiehlst Du es dann?
2. machst Du Dich nicht schlau warum alle meckern?
3. benutzt Du es, obwohl es den Threadersteller nicht einmal beim Problem hilft?
Delegaten und Hilfskonstrukte wie der Backgroundworker wurden ja nicht aus Jux und Dollerei implementiert.
@AsdAsd1337: CheckForIllegalCrossThreadCalls solltest Du niemals antasten. Es gibt kein Szenario in dem das Umstellen auf false einen produktiven Vorteil bringt, damit vertuschst Du nur schlampig programmierten Code.
Wichtige Quellen unter anderem: Multithread-Programmierung mit Visual Basic, Verwaltetes Threading und VB.NET Tipps: Multithreading, wobei dort diese Stelle über Marshalling für Dich am interessantesten sein dürfte.
Gruß FatFire -
Habs jetzt nicht probiert, aber wäre untiges nicht ne Lösung für alle "Faulpelze"?
VB.NET-Quellcode
- Private Sub ControlPropSetter(ByVal ctl As Control, ByVal propname As String, ByVal value As Object)
- Try
- ctl.GetType.GetProperty(propname).SetValue(ctl, value, Nothing)
- Catch ex As Exception
- Debug.Print(ex.Message)
- End Try
- End Sub
- Private Delegate Sub dlgControlPropSetter(ByVal ctl As Control, ByVal propname As String, ByVal value As Object)
- Private Sub ThreadSafeSet(ByVal ctl As Control, ByVal propname As String, ByVal value As Object)
- If ctl.InvokeRequired Then
- Dim dlg As dlgControlPropSetter = AddressOf ControlPropSetter
- ctl.Invoke(dlg, New Object() {ctl, propname, value})
- Else
- ControlPropSetter(ctl, propname, value)
- End If
- End Sub
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „picoflop“ ()
-
-
Meintest Du nicht:
statt
?...Huch, ach, schon korrigiert...schlimmer Finger und ich bastel hier rum
Naja, obiges geht auch und Du mußt Dir kein Object-Array basteln, weil es eh als ParamArray übergeben wird.
Gruß FatFire
Edit: Man könnte da bestimmt noch einiges Logik dahinterpacken, damit die Performance optimiert wird...wenn Änderungen in zu schneller Folge ankommen z.B. nur jede x-te auch an das Control senden (macht beim Textbox.Text ja Sinn) oder die Änderungen sammeln und dann auf einen Schlag absetzen (z.B. AppendLines von einer RTB oder Items.Add im Rahmen eines Listbox-Updates)...ach, letztendlich ist es in den meisten Fällen halt doch nicht mit einem einfachen "sende Objekt A an Methode B getan". Aber schon ein schönes LernstückDieser Beitrag wurde bereits 1 mal editiert, zuletzt von „FatFire“ ()
-
FatFire schrieb:
Edit: Man könnte da bestimmt noch einiges Logik dahinterpacken
Evtl zwischenspeichern von control, Property etc in irgendeiner List.
MW. frisst aber doch schon der Delegate an sich verhältnissmäßig (!) viel Performance?
Vlt findet sich ja jemand, der das ganze "schön" macht und mal in den sourcecode-Austausch packt. Dann hat vlt dieses ewige hin- und her mit den threadübergreifenden Vorgängen ein Ende. Ein Newbie braucht dann nur noch C&P.
Immer noch besser als die Überprüfung disablen
EDIT: Sollte vermutlich auch gesynclocked werden oder?Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „picoflop“ ()
-
Also, ich hab da jetzt was gebastelt...aber das dürfte...naja, irgendwie sieht es für mich sehr sonderbar aus und ich glaube performancemässig nimmt sich das jetzt gar nichts mit Deiner Methode:
Spoiler anzeigen 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
Das Modul kann man irgendwie in sein Projekt mit reinschleppen und z.B. so den Text einer Textbox setzen
Oder eine Methode ausführen:
Ihr könnt es auch ja mal anschauen. Ganz gut finde ich es, weil Delegaten nur für die beiden Funktionen im Modul nötig sind und diese ständig deklariert bleiben können...vielleicht bringt das ja ein wenig Performance.
Gruß FatFire
PS: Picoflop, wäre da vor allem sehr an Deiner Meinung interessiert. Vor allen Dingen wegen Synclock (Du kennst da ja meine Schwäche ). Obwohl ich da eigentlich keine Notwendigkeit sehe, die Sachen im GUI-Thread müssen so oder nacheinander abgearbeitet werden und bei meiner Implementierung als statische Methoden in einem Modul dürfte es da auch keine Probleme geben, weil sowas prinzipbedingt sicher ist. Es werden ja auch keine statischen Werte mittendrin neu belegt. -
FatFire schrieb:
Obwohl ich da eigentlich keine Notwendigkeit sehe, die Sachen im GUI-Thread müssen so oder nacheinander abgearbeitet werden
Hatte noch die Idee evtl als optionalen Parameter "Async" mit anzugeben, so dass man entweder Invoke oder BeginInvoke arbeitet.
ansonsten sieht der Code doch schon mal gut aus.
Synclock ja/nein .. k.A ehrlich. Ich bau's halt im Zweifel lieber immer einmal zu viel als einmal zu wenig ein. -
Also ich hab da jetzt noch ein wenig sonderbares Verhalten, wenn ich die draufzugreifenden Threads nicht irgendwie mal kurz ausbremse mit Sleep. Scheinbar können mehrere parallel laufende Threads den GUI-Thread durchaus an die Wand drücken, dass der keine Luft mehr zum Atmen hat. Mit Synclock seh ich da auch keine Änderung oder ich hab es mal wieder falsch benutzt
Gruß FatFire
Edit: Das mit Async ist natürlich auch noch mal ne Idee...
-
Ähnliche Themen
-
Threadübergreifend in ListBox schreiben!
buettner123 - - Sonstige Problemstellungen -
viperkill - - Sonstige Problemstellungen
-