Fenster und Threads



  • Hab mal eine "Anfängerfrage" bzgl. Fenster & Threads. Folgende Konstellation:
    - in InitInstance() wird ein von CWnd abgeleitetes (einfaches) Fenster erzeugt (das Fenster verarbeitet "spezielle" Nachrichten). Ebenfalls in InitInstance() wird eine CWinThread erzeugt.

    Frage(n):
    - Kann man das oben erstellte Fenster auch in der erzeugten CWinThread zerstören oder ist besser (bzw. muss sogar), das im Kontext der Ersteller-Thread zu tun?

    Muss man bei einem solchen "einfachen" Fenster unbedingt DestroyWindow() aufrufen? (ohne den Aufruf kommt am Ende eine Debug-Meldung, dass das DestroyWindow bei abgeleiteten Klassen nicht aufgerufen wird) Ich meine, kann das "negative" Auswirkungen auf die MFC selbst haben?

    Hoffe, ich hab mich halbwegs verständlich formuliert.

    ilen Dank und fröhliches Eier-Suchen!


  • Mod

    1. DestroyWindow darf nur aus dem eigenen Thread aufgerufen werden.
    2. Grundsätzlich sollten CWnd Objekte nur aus dem Thread angesprochen werden in dem sie erzeugt werden. CWnd ist nicht für Zugriffe über Threadgrenzen hinweg gebaut. (Du bekommst an massig vielken Stellen ASSERTs).

    Kann man das oben erstellte Fenster auch in der erzeugten CWinThread zerstören oder ist besser (bzw. muss sogar), das im Kontext der Ersteller-Thread zu tun?

    Die Frage verstehe ich in keiner Weise. Was für einen Kontext meinst Du? Was meinst Du in CWinThread zerstören?

    Muss man bei einem solchen "einfachen" Fenster unbedingt DestroyWindow() aufrufen?

    Ja. Zumindest für das Parent Window.

    (ohne den Aufruf kommt am Ende eine Debug-Meldung, dass das DestroyWindow bei abgeleiteten Klassen nicht aufgerufen wird) Ich meine, kann das "negative" Auswirkungen auf die MFC selbst haben?

    Ja, wenn das Objekt aus einem anderen Thread zerstört wird.
    Ja es enstehen evtl. Leaks. Nicht alle Objekte liegen auf dem Stack oder eingebettet in anderen Objekten. Manche Objekte werden im Heap erzeug



  • Du sendest dem thread eine Message, dass er sich beenden soll.
    Dann führt der thread selber

    ::PostQuitMessage(0);
    

    aus und alles geht sauber und ohne Probleme zu Ende.



  • Vielen Dank für die Erklärungen!

    Hab's begriffen 🙂


Anmelden zum Antworten