Multithreading | Control aus dem Hintergrundthread mit Invoke und Delegates

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von FriedV.

    Multithreading | Control aus dem Hintergrundthread mit Invoke und Delegates

    Hallo Leute,

    ich sitze jetzt schon wirklich lange vor dem Problem wie ich aus einem anderem Thread auf Controls im Hauptthread zugreife. Mein bisheriger Code mit Invoke und Delegates funktioniert leider nicht!

    VB.NET-Quellcode

    1. Public Class Auftrag
    2. Private Shared thread As New Threading.Thread(AddressOf AsyncWork)
    3. Private Delegate Sub UpdateTextHandler(ByVal MyControl As Control, ByVal Text As String)
    4. Public Shared Sub Arbeite()
    5. thread.Start()
    6. End Sub
    7. Private Shared Sub AsyncWork()
    8. Form1.Label1.Invoke(New UpdateTextHandler(AddressOf Form1.UpdateControl), Form1.Label1, "TESTSTRING")
    9. End Sub
    10. End Class


    VB.NET-Quellcode

    1. Public Class Form1
    2. Public Shared Sub UpdateControl(ByVal MyControl As Control, ByVal Text As String)
    3. MyControl.Text = Text
    4. MyControl.Refresh()
    5. End Sub
    6. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    7. Auftrag.Arbeite()
    8. End Sub
    9. End Class


    In der Zeile mit Invoke kommt immer:
    Invoke oder BeginInvoke kann für ein Steuerelement erst aufgerufen werden, wenn das Fensterhandle erstellt wurde.
    Ich habe schon sämtliche Lösungsversuche mit CreateHandle versucht aber ich komme auf keine Lösung. Leider hat auch die Suchfunktion nicht geholfen!

    Ich hoffe ihr könnt mir hier etwas helfen!

    Fynnl

    VB.NET-Quellcode

    1. Private Shared Sub AsyncWork()
    2. Form1.Label1.Invoke(New UpdateTextHandler(AddressOf Form1.UpdateControl), Form1.Label1, "TESTSTRING")
    3. End Sub

    Ist Form1 der Name der Klasse oder der Name einer Variable, die die Instanz dieser Klasse hält?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    VB.NET-Quellcode

    1. Private Shared Sub AsyncWork()
    2. Form1.Label1.Invoke(New UpdateTextHandler(AddressOf Form1.UpdateControl), Form1.Label1, "TESTSTRING")
    3. End Sub

    Ist Form1 der Name der Klasse oder der Name einer Variable, die die Instanz dieser Klasse hält?


    Form1 ist die Klasse, die meine Form1 aus dem Designer darstellt. Ich habe euch übrigens den gesamten Code aus meinem Test-programm geschrieben! So habe ich es in vielen Tutorials und How-To's gefunden und mal auf mein Problem angepasst. Leider funktioniert es einfach nicht. Ich habe das Problem bisher immer so gelöst, dass der "TestString" in eine Variable geschrieben wird. Diese wird dann über einen Timer (in Form1) ständig ausgelesen und auf die Label1 gebracht, aber diese Lösung finde ich für meine Verhältnisse etwas seeehr primitv ;)
    Du hast also meine Frage nicht verstanden :D :D :D
    Probiers mal so. Ich hoffe, Du weißt nun, was ich gemeint habe.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Auftrag
    2. Private Shared thread As New Threading.Thread(AddressOf AsyncWork)
    3. Private MyForm As Form1
    4. Private Delegate Sub UpdateTextHandler(ByVal MyControl As Control, ByVal Text As String)
    5. Public Shared Sub Arbeite(Form As Form1)
    6. MyForm = Form
    7. thread.Start()
    8. End Sub
    9. Private Shared Sub AsyncWork()
    10. MyForm.Label1.Invoke(New UpdateTextHandler(AddressOf Form1.UpdateControl), Form1.Label1, "TESTSTRING")
    11. End Sub
    12. End Class
    13. Public Class Form1
    14. Public Shared Sub UpdateControl(ByVal MyControl As Control, ByVal Text As String)
    15. MyControl.Text = Text
    16. MyControl.Refresh()
    17. End Sub
    18. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    19. Auftrag.Arbeite(Form1)
    20. End Sub
    21. End Class
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    oups :D

    Na auf jeden Fall danke!! Endlich hab ichs geschafft jedoch musste diese Zeile noch angepasst werden.

    VB.NET-Quellcode

    1. MyForm.Label1.Invoke(New UpdateTextHandler(AddressOf Form1.UpdateControl), MyForm.Label1, "TESTSTRING")


    Es muss natürlich MyForm.Label1 und nicht Form1.Label1 heißen!

    Dankeschön :)
    Auch von mir vielen Dank, hat auch mein Problem gelöst!
    Ich steuere einen Roboter über die RS232 Schnittstelle, das erfolgt ja (leider) immer in einem nebenläufigen Thread.
    Ich habe bisher keine Möglichkeit gefunden, dem Rechenknecht das zu verbieten!
    Cheers, Friedrich


    ErfinderDesRades - Moderator - Notiz: bitte keine Uralt-Threads wiederbeleben
    --> closed

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