Multithreading "Window Handle"-Fehler

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Rootbob91.

    Multithreading "Window Handle"-Fehler

    Guten Tag,


    ich habe eine Frage/ein Problem.. Kann man Invoke/BeginInvoke nicht aus einer control-/formlosen Klasse aufrufen?

    Ich führe in der Klassenmethode eine SQL-Abfrage aus, die etwas länger ausgeführt wird, daher möchte ich nach der Abfrage mit BeginInvoke in wieder in den vorherigen "Thread".


    Leider kommt dann der Fehler "Invoke or BeginInvoke cannot be called on a control until the window handle has been created."


    Ps: Normal ist die Funktion Begin-/Invoke ja nur in von Control abgeleiteten Klassen vorhanden, daher hatte ich auch versucht ebendies zu machen, dann war die Funktion verfügbar, allerdings ebenfalls auch der Handle-Fehler.
    Polling is trolling!

    Achtung: Ich habe die komische Angewohnheit, simple Dinge zu verkomplizieren..
    Und wieder ist es mir passiert... Ich überlege ne Stunde an ner Problemstellung rum...

    Poste es..

    Und dann bekomme ichs gelöst :/ :D..


    Die Lösung:
    Manuell ein

    VB.NET-Quellcode

    1. Sub New()
    erstellt, und darin dann für die Instanz meiner Klasse die Funktion CreateHandle aufgerufen

    VB.NET-Quellcode

    1. Me.CreateHandle


    Danke trotzdem :)!
    Polling is trolling!

    Achtung: Ich habe die komische Angewohnheit, simple Dinge zu verkomplizieren..
    @ErfinderDesRades
    Verstehst du, was er gemacht hat? Er hat ne Klasse erstellt, die irgend ne Aufgabe asynchron durchführt. Dann wollte er seine GUI aus dieser Klasse aktualisieren (<- das ist schon mal der erste Denkfehler), das ging aber nicht, weil er in nem anderen Thread ist. Deswegen hat er seine Klasse von Control erben lassen, damit er Invoke zur Verfügung hat (<- 2. Schlamperei, die Klasse ist kein Control also hats auch nicht davon zu erben).
    Richtig wäre es, aus der Klasse ein Event zu schmeißen, dieses in der GUI zu empfangen und dann entsprechend zu aktualisieren (mitsamt dem Invoken).
    nee - ich verstehe nicht was er gemacht hat. Deine Interpretation ist schon schlüssig, und das wär schon grauselig, nur gibts vom TE dazu eiglich bisher zuwenig Information, ob ers wirklich so gemacht hat.
    Ich hab jetzt auch nochmal geguckt, wie ichs gemacht hab, und stelle fest, wenn Handle nicht created war, habichs nicht erzwungen, sondern die Meldung einfach unterschlagen.
    Also so ungefähr gugge SplashScreen mit Feedback

    Artentus schrieb:

    Richtig wäre es, aus der Klasse ein Event zu schmeißen, dieses in der GUI zu empfangen und dann entsprechend zu aktualisieren (mitsamt dem Invoken).

    Ich hab es leider so gemacht wie du gesagt hast, ich werde das mal umbauen..

    Gemacht habe ich das so, weil ich alles was GUI bezogen ist, auch da laufen lassen will und alles was DB technisch oder eben halt nicht in den GUI-Thread gehört in der Klasse ablaufen zu lassen, damit ich auch die Klasse später wieder woanders importieren kann.


    Würdest du mir vll. sagen wie ich ein Event aus einer anderen Klasse in der Hauptklasse abfangen kann?


    Ps: Danke das du mich drauf hingewiesen hast, ich bin halt nicht perfekt, allerdings bin ich immer für optimalere Lösungen übrig - und sowieso ein Perfektionist.
    Wenn ich was neues gelernt habe, dann gehe ich meistens meine alten Projekte nochmal an und verbessere die jeweilige Sache.

    Da ich halt auch nicht alles weiß, muss ich halt den Weg wählen den ich kenne ;)!
    Polling is trolling!

    Achtung: Ich habe die komische Angewohnheit, simple Dinge zu verkomplizieren..

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

    Oh mein Gott..

    Kurz gesagt wäre die Lösung doch einfach nur, die Klasse die ich verwende bzw. deren Instanz mit WithEvents zu deklarieren, oder seh ich das falsch :O?

    Ps: Danke für die Links ;)!
    Polling is trolling!

    Achtung: Ich habe die komische Angewohnheit, simple Dinge zu verkomplizieren..