Thread in anderer Klasse wirft Fehler

  • VB.NET

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

    Thread in anderer Klasse wirft Fehler

    Guten Morgen allerseits :)
    Ich wollte in meinem Programm nun einige größere Prozeduren, die doch ein wenig ressourcenlastig sind, in Threads packen.. Außerdem stehen diese Dinger auch in einer andere Klasse.
    Allerdings hab ich jetzt das Problem, das auch einige Sachen davon in meiner Hauptform ausgegeben werden sollen, in Form eines Fortschritts einer ProgressBar.
    Dooferweise bekomme ich dabei aber immer den folgenden Fehler:

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

    VB.NET-Quellcode

    1. MainWindow.Invoke(Sub() MainWindow.ToolStripStatus.Text = "Lese Einstellungen")
    der Thread wird im Form_Shown Event gestartet

    der genaue Aufruf sieht dabei so aus:

    VB.NET-Quellcode

    1. Private Sub MainWindow_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown
    2. [...]
    3. Dim ReadSettingsThread = New Thread(AddressOf Settings.ReadApplySettings)
    4. ReadSettingsThread.Start()
    5. [...]
    6. End Sub
    Guten Morgen zurück :)

    Diesen Fehler hab ich auch schon gehabt, allerdings in einem anderen Zusammenhang. Er entsteht normalerweise wenn Dein Thread schon versucht auf ein Control zuzugreifen , wenn es noch garnicht angezeigt wurde. Jedes Control (Form, Button, Label,etc.) basiert auf einem Window, dass erst erzeugt werden muss bevor Methoden oder Eigenschaften invoked werden können.

    Es gibt ein paar Möglichkeiten den Fehler zu beheben:
    - starte Deine Threads nicht zu früh, z.B. erst im Shown Event
    - frage die Control Eigenschaft isHandleCreated vor dem Invoke ab
    - erzwinge die Erstellung eines Handles indem Du einfach darauf zugreifst (Dim ptr as intPtr = Mainwindow.Handle )

    Edit: invoke mal statt des Windows das MainWindow.ToolStripStatus und wende eine der obigen Methoden an. Prüfe mal mit isHandleCreated ab, wessen Handle (Mainwindow, ToolStrip) noch nicht da ist.

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

    also einen solchen Invoke Aufruf hab ich auch noch nie gesehen, kann sein, dass es in der neuen IDE funktioniert^^

    evtl. könntest du es trotzdem mal altmodisch mit einem Delegaten probieren?
    Aus einer Klasser heraus könnte man auch noch Events feuern, z.B. über den AsyncManager->[VB.NET] Threading.Thread benutzerdefinierte Events auslösen
    (auch mit einer Klasse)
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    ach herje ^^
    schonmal danke für die hilfe..
    hab bisher mal die Ansätze von Kangaroo durchgegangen..
    - der thread wird erst im Shown-Event erstellt und gestartet
    - weder das FensterHandle noch das Handle vom ToolStripStatus ist vorhanden :o
    - das erzwingen des FensterHandles hat nichts gebracht..

    @jvbsl: wie sieht denn ein "normaler" invoke aufruf aus? ^^
    diese methoden habe ich von einem Freund der ebenfalls in vb.net programmiert und bei anderen threads hat es auch so funktioniert.. wobei da diese threads auch in der gleichen klasse waren ^^

    edit: habe jetzt nochmal mit dem Handle des Hauptfensters und des ToolStripStatus geguckt.. also auf das Handle zugegriffen wie Kangaroo beschrieben hatte..
    Jetzt bekomm ich zwar keinen Fehler mehr, aber es passiert auch nix mehr in der Hauptform :o
    hmm, irgendwo verschluckt er sich. Der Aufruf über die Sub als anonyme Methode sollte ok sein, allerdings mag er wohl MainWindow als Klasse und KlassenInstanz gleichzeitig nicht besonders.

    Versuch mal folgendes:
    - lege in Deiner Klasse Settings mall ein Public Member Public frm as MainWindow an
    - weise diesem im Constructor deiner Klasse die Instanz Deines MainWindows zu
    - verwende beim invoken das member frm

    Kommst Du damit klar ?