Aus anderem Thread Steuerelemente aktualisieren

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Mad Andy.

    Aus anderem Thread Steuerelemente aktualisieren

    Hi!

    Hab ein ganz blödes Problem, bin mir bei dem, was ich jetzt schreibe nichtmal 100% sicher, dass es so ist ...
    Wenn ich per System.Net.Sockets.Socket.BeginReceive Daten empfangen will (UDP), wird das Callback scheinbar in einem getrennten Thread ausgeführt (nehm ich zumindestens an, macht auch Sinn). Wenn ich dann von dort aus einem Container (Panel) dynamisch Steuerelemente hinzufügen will, bleibt bei der Add-Methode der Thread stehen. Ich löse das jetzt mit einem Timer (den es sowieso gibt) und einer Boolean-Variable, finde das aber auch nicht unbedingt sauber.

    Gibts es für mein Problem eine bessere Lösung? Von welchem Thread werden Events behandelt?
    Code Snippet hab ich leider nicht da, habs aber noch ungefähr im Kopf, falls es fragen gibt.

    So am Rande.. ich benutze dafür C#/.net 1.1
    Die dynamisch erstellten Steuerelemente sollten natürlich im Thread der Form erstellt werden.

    Wenn deine Callback vom BeginReceive (UDP_CallbackFkt im nachfolgenden Bsp) in einem anderen Thread ausgeführt wird mußt du eben einen Invoke auf die Form machen.

    VB.NET-Quellcode

    1. Delegate Sub UDP_Delegate(ByVal params As Irgendwas)
    2. Private Sub UDP_CallbackFkt(ByVal params As Irgendwas) Handles UDP_Callback
    3. '// Diese Sub läuft im UDP-Thread, von hier kein sicherer Zugriff auf Steuerelemente
    4. '// Funktion im Thread der Form aufrufen und Parameter durchreichen
    5. Me.Invoke(New UDP_Delegate(AddressOf UDP_DelegateFkt), params)
    6. End Sub
    7. Private Sub UDP_DelegateFkt(ByVal params As Irgendwas)
    8. '// Diese Sub läuft im Thread der Form,
    9. '// hier kann man mit den Steuerelementen machen
    10. '// was man will, also auch neue Adden
    11. End Sub


    Gruß
    Gaga
    Ich hatte mal ein ähnliches Problem mit einem COM-Server (ActiveX-exe) -> läuft unter VB.net in einem eigenen Thread.

    Ich bekam in einer net-Klasse - dessen Objekt im Thread der Form instanziert wurde - vom COM-Server ein Event.
    Daraufhin hat diese Klasse ein Event an die Form ausgelöst. Dieses Event landete in der Form ohne Invoke auch im Thread des COM-Servers, mit Invoke klappte es.

    Deshalb vermute ich, dass selbstdefinierte Events in dem Thread landen in dem sie ausgelöst wurden.

    Gruß
    Gaga
    kk, danke.

    Wie es so ist, bleib ich aber aus anderen Gründen (CPU-Belastung) sowieso bei meinem Timer. Es kommen nämlich immer mehrere Oakete per UDP hintereinander und jedes mal neu zu zeichnen, wenn die Form relativ voll ist, braucht zu lange, im Extremfall stauen sich dann die Refresh-Aufrufe.

    Für die Multithreading- und Async-Zukunft bringt mir das aber sicherlich noch etwas :)
    Andere Sache, weißt du zufällig, warum das Programm stehen bleibt? Gibt es im Threading-Namespace nicht irgendeinen Befehl, der alles abarbeiten lässt? Ich bilde mir ein da mal was gelesen zu haben, weiß aber nichtmehr unter welchem Titel...

    Danke nochmal.