Invoke aus anderer Klasse

  • VB.NET

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

    Invoke aus anderer Klasse

    Hallo muss gleich weg, deswegen mach ichs kurz. Wenn ich diesen Code benutze:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Button1_Click (...)
    3. Class1.t.Start()
    4. End Sub
    5. End Class
    6. Public Class Class1
    7. Public Delegate Sub myDel(ByVal number As Integer)
    8. Public Shared t As New Threading.Thread(AddressOf start)
    9. Public Shared Sub start()
    10. Dim counter As Integer = 1
    11. Do
    12. Form1.Invoke(New myDel(AddressOf result), counter)
    13. Threading.Thread.Sleep(1000)
    14. counter += 1
    15. Loop
    16. End Sub
    17. Public Shared Sub result(ByVal number As Integer)
    18. Form1.Label1.Text = "Test " & number
    19. End Sub
    20. End Class


    Dann bekomme ich folgende Fehlermeldung:

    Quellcode

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

    Ich rufe doch Invoke auf, wenn ich auf den Button klicke, also wurde das Fensterhandle doch schon erstellt oder? Wenn ich jedoch die beiden Subs start & result in der Form1 Klasse einfüge, dann funktioniert alles problemlos, nur mit einer anderen Klasse nicht..weiß jemand warum das so ist? Ich würde es gerne in einer anderen Klasse haben, damit meine Hauptklasse nicht mit tausenden Aufrufen vollgestopft ist..
    Du meinst alles in die Form1 Klasse? Genau das will ich ja nicht, weil ich es am Ende gerne so hätte, dass im Button_Click-Event einfach nur der Aufruf ist - evtl. mit einigen anderen Parametern - und der ganze Code der die Aktionen dann durchführt in einer anderen Klasse ist.
    Ist dir schonmal aufgefallen, dass Form1 in Form1.Invoke gar kein Objekt ist, sondern eine Klasse?

    gugge auch VeryBasics

    Das geht nur in VB, und dassis schlimm, dass das geht, und bei Threading gehts halt schief.
    Weil der Nebenthread ein neues Form erstellt, anstatt das zunehmen, welches du gemeint hast.

    Bei meine Treading-Aktionen verwende ich immer Applicatio.OpenForms(0) als invokendes Control (es ist ja egal, welches man nimmt)
    Ist aber auch ein bisschen deine Schuld , wieso benutzt du kein Vb 2010?
    Mit diesem Uraltinvoke ist das sowieso Käse.

    Hier mal ein Beispiel:

    Imports System.Threading

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private m As New Test()
    3. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    4. m.Start(Me)
    5. End Sub
    6. End Class
    7. Public Class Test
    8. Dim t As New Thread(AddressOf Test)
    9. Private frm As Form1
    10. Public Sub Start(ByVal frm As Form1)
    11. t.Start()
    12. Me.frm = frm
    13. End Sub
    14. Public Sub Test()
    15. While True
    16. frm.Invoke(Sub()
    17. frm.Button1.Text += 1
    18. End Sub)
    19. Thread.Sleep(100)
    20. End While
    21. End Sub
    22. End Class