Threadübergreifende Controls

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von nikeee13.

    Threadübergreifende Controls

    Hallo

    Ich habe folgende 2 unterschiedliche Threads (davon ist auch keiner der Haupthread - also wirklich 2 eigenständige Threads):

    VB.NET-Quellcode

    1. Dim INTERPRETEN_PANEL As FlowLayoutPanel
    2. Dim WithEvents TITEL_PANEL As FlowLayoutPanel
    3. Private Sub InterpretenInit()
    4. INTERPRETEN_PANEL = New FlowLayoutPanel
    5. Dim i As New Interpret()
    6. i.AddCover(getCover())
    7. INTERPRETEN_PANEL.Controls.Add(i)
    8. End Sub
    9. Private Sub TitelInit()
    10. TITEL_PANEL = New FlowLayoutPanel
    11. Dim t As New Titel
    12. Dim ob() As Object = {"1", "2", "3", "4"}
    13. t.AddRow(ob)
    14. TITEL_PANEL.Controls.Add(t)
    15. End Sub


    Titel und Interpret sind 2 Controls die ich mir selber gebastelt habe. Auf dem Interpret befindet sich eine PictureBox auf Interpret eine DataGridView. Die Funktionen aus den Threads sehen so aus:

    VB.NET-Quellcode

    1. Public WriteOnly Property Image As Bitmap
    2. Set(ByVal value As Bitmap)
    3. PictureBox1.Image = value
    4. End Set
    5. End Property
    6. Public Sub AddRow(ByVal values() As Object)
    7. DataGridView1.Rows.Add(values)
    8. End Sub


    Wenn ich jetzt über Buttons einem Panel auf der Form einmal INTERPRET_PANEL und einmal TITEL_PANEL per Panel1.Controls.Add(...) zuweise kommt es bei dem TITEL_PANEL zu dem Laufzeitfehler:

    Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement DataGridView1 erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde.


    Das INTERPRET_PANEL kann ohne Probleme dem Panel1 auf der Form zugewisen werden. Woran liegt das? In meinem Code sehe ich gerade keinen Fehler. Wird eine DataGridView anders als eine PictureBox von Threads behandelt oder liegt es vllt an der WriteOnly Property die anders behandelt wird - wie läuft das? Vllt sehe ich es aber gerade auch einfach nur nicht. Würde mich freuen wenn mal jemand drüber gucken könnte und mir sagen kann was falsch ist.

    Bin für jede Hilfe dankbar. Viee Grüße
    Croasider

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

    Croasider schrieb:

    Ungültiger threadübergreifender Vorgang
    Hättste mal nach diesem Text gesucht, wärste schon fertig.
    Du kannst zwar aus einem anderen Thread GUI-Properties abfragen, setzen jedoch funktioniert nicht. Dazu musst Du Dich der Invoke-Methode bedienen.
    Allerdings gestattet dasd Studio 2008 noch nicht die von @kinsi: gezeigte Syntax, da musste mal bei MSDN nachschlagen.
    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:

    Du kannst zwar aus einem anderen Thread GUI-Properties abfragen, setzen jedoch funktioniert nicht.

    Und warum klappt dann das setzen von der PictureBox?

    Pane

    VB.NET-Quellcode

    1. l1.Controls.Add(TITEL_PANEL) ' wird aus GUI Thread aufgerufen

    Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement Titel erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde.

    Wie soll ich denn dabei ein Invoke nutzen? Auf die DataGridView bezogen oder auf das Panel?

    Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von „Croasider“ ()

    Huhu,

    für das Panel geht es so.

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    2. Dim t As New Thread(AddressOf DoStuff)
    3. t.Start()
    4. End Sub
    5. Private Sub DoStuff()
    6. Dim b As New Button
    7. b.Text = "TestButton"
    8. Me.Panel1.Invoke(Sub(btn As Button)
    9. Me.Panel1.Controls.Add(btn)
    10. End Sub, New Object() {b})
    11. End Sub


    wobei Du das Invoke auch so formulieren kannst:

    VB.NET-Quellcode

    1. Private Sub DoStuff()
    2. Dim b As New Button
    3. b.Text = "TestButton"
    4. Me.Panel1.Invoke(Sub()
    5. Me.Panel1.Controls.Add(b)
    6. End Sub)
    7. End Sub


    Eine Antwort, warum es bei der PictureBox geht, kann ich Dir nicht geben, ich bin selber grad am Schauen.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o