Aus einem anderen Thread auf ein Control im Hauptthread zugreifen

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von Fynnl.

    Aus einem anderen Thread auf ein Control im Hauptthread zugreifen

    Hallo,

    ich bin jetzt nicht so uninformiert wie ihr jetzt vielleicht denkt! Ich habe schon wirklich viel über Delegates (Was ich nicht so ganz verstehe) und BackGroundWorker gelesen... Leider erfüllt der BackGroundWorker nicht den Zweck, für den ich ihn gedacht habe! Es ist einfach so: Ich habe einen 2. Thread der unendlich lange läuft, da eine Do ... Loop Schleife ständig was ausliest. Also kann ich auf den Thread praktisch nicht verzichten ;) Nun möchte ich auf ein Control im Hauptthread zugreifen. Das soll irgendwie mit Invoke gehen, habe aber nirgendwo was passendes gefunden... ;(

    Ich hoffe das kann mir jemand erklären!

    Fynn
    nein, hatte ich leider noch nicht... Dummweise gibt es auch noch ein Problem:
    Ach, erstmal der Code: ^^

    Deklaration:

    VB.NET-Quellcode

    1. Delegate Sub WriteTextDelegate(ByVal Text As String)
    2. Private Shared serverbw As New System.Threading.Thread(AddressOf ServerPart)
    3. Private Shared clientbw As New System.Threading.Thread(AddressOf ClientPart)


    AddMessage:

    VB.NET-Quellcode

    1. Private Shared Sub AddMessage(ByVal text As String)
    2. Form1.chat.Text += text & vbCrLf
    3. End Sub


    Verwendung im Thread 2 (ServerPart):

    VB.NET-Quellcode

    1. Form1.Invoke(New WriteTextDelegate(AddressOf AddMessage), "Test")


    Leider kommt bei Form1.Invoke[...] immer ein Fehler. Ich kenne diesen nicht, und weiß nicht wie ich damit umzugehen habe ^^

    Invoke oder BeginInvoke kann für ein Steuerelement erst aufgerufen werden, wenn das Fensterhandle erstellt wurde.


    Was ist da jetzt mit Fensterhandle gemeint?

    Fynn
    ich habe jetzt noch herausgefunden, dass ich ein Handle erstellen muss... äh, leider kann ich damit nicht viel anfangen. Beim Suchen bei Google bin ich dann auf Control.CreateHandle gestoßen, dass war allerdings C# oda so, und außerdem gibt es das bei VB nicht...

    Könnt ihr mir helfen?

    Fynn
    ^^ Das gleiche Problem hatte ich vor kurzem auch, so hab ichs gelöst:
    Hab das ganze hier schon so gefunden, doch weiß ich leider den thread nicht mehr...

    Hier als bsp nen Label:

    VB.NET-Quellcode

    1. Delegate Sub dlSetAnyLabel(ByVal tb As Label, ByVal s As String)
    2. Private Sub setAnyLabel(ByVal tb As Label, ByVal s As String)
    3. tb.Text = s
    4. tb.Refresh()
    5. End Sub


    und so greift man aus dem thread darauf zu:

    VB.NET-Quellcode

    1. Dim l As New dlSetAnyLabel(AddressOf setAnyLabel)
    2. Invoke(l, NameDesLabels, "Text der rein soll")


    @ xXMichaelXx
    Das funktioniert zwar ist aber keine Wirklich brauchbare Lösung.
    vielen DANK für deine Antwort! Aber leider kommt immernoch der gleiche Fehler! Ich habe den Thread nämlich in einer anderen Datei (auch: Andere Klasse), leider kennt er dann nur Invoke(...) nicht. Entwerder ich nehme Form1.Invoke order Control.Invoke. Beides geht nicht...

    Invoke oder BeginInvoke kann für ein Steuerelement erst aufgerufen werden, wenn das Fensterhandle erstellt wurde.


    Ich weiß einfach nicht weiter... Wo müsste ich denn die Lösung von xXMichealXx einbauen?

    Fynn