Problem: Memory Leaks mit CWinThread ???



  • Hallo zusammen.

    Was mache ich falsch, wenn meine Threads beim Beenden folgendes produzieren:

    faulted while dumping object at ..., 264 bytes long

    Die Anweisung #define new DEBUG_NEW lieferte mir folgende Zeile als Verursacher:

    IMPLEMENT_DYNCREATE(CalculateThread, CWinThread)

    Gruß, Sven



  • Nachtrag:

    Der LeakFinder (von Jochen Kalmbach) bringt mich leider auch nicht weiter, da er mich auf dieselbe Spur bringt. Das Problem entstehe angeblich beim Anlegen und Starten des Threads. 😕



  • Ist CWinThread::m_bAutoDelete gesetzt?
    Simon



  • Ich habe es mit TRUE und FALSE probiert.
    Auf FALSE habe ich den Thread per m_objThread.m_hThread.Delete() abschließend gelöscht.

    Beides brachte mir nicht die Lösung.



  • Nachtrag:

    Ich benutze keine ThreadFunktion, sondern eröffne eine ThreadKlasse.

    [cpp]
    m_objThread = 
    CreateThread(  RUNTIME_CLASS (CThreadKlasse)
                 , THREAD_PRIORITY_BELOW_NORMAL
                 , 0
                 , CREATE_SUSPEND);
    
    m_objThread->ResumeThread();
    [/cpp]
    

  • Mod

    Ich würde simpel und einfach sagen, dass der Thread nicht terminiert!



  • Laß dir doch eine message vom thread in ExitInstance posten "Ich habe fertig".

    Solange du nicht von allen threads die message hast, verweigerst du OnClose.



  • Ok, ich habe eine ExitInstance()-Methode in meinen Threads, aber der Breakpoint zieht nicht. Scheinbar wird diese Methode nicht aufgerufen.

    Ich wollte die Threads von außen steuern und beende sie per aufruf innen mit AfxEndThread(0).
    Mein Programm endet erst, wenn die Threads als Exitcode nicht mehr STILL_ACTIVE(256) zurück geben.
    Im Debugmode verschwinden sie auch aus dem Überwachungsfenster "Threads", so wie gewünscht.

    Was mach ich denn falsch beim Beenden?
    Ich dachte es sei so einfach:

    AfxBeginThread() und AfxEndThread(). 😞



  • Beende dein Thread durch verlassen (return) der Thread Funktion.
    Simon



  • Ich nutze eine Klasse, nicht nur eine Funktion.



  • AfxEndThread solltest du NIE benutzen!

    Stattdessen sooltest du eine message an den thread schicken, daß er sich beenden soll.
    Dieser reagiert dann mit ::PostQuitMessage(0); und sendet danach in ExitInstance eine message and den main thread, daß er sich beendet hat.


  • Mod

    EOP schrieb:

    AfxEndThread solltest du NIE benutzen!

    Stattdessen sooltest du eine message an den thread schicken, daß er sich beenden soll.
    Dieser reagiert dann mit ::PostQuitMessage(0); und sendet danach in ExitInstance eine message and den main thread, daß er sich beendet hat.

    1. AfxEndThread darf man benutzen. Es terminiert den aktuelen Thread.
    Besser ist jedoch einfach die Thread Funktion mit einem return zu verlassen-
    2. Warum soll man an einen Thread eine Nachricht senden, meistens haben die keine Message-Loop. Ein simples Flag tut es doch auch.



  • Sry, ich bin da beim Einsetzten von Klassen auch nicht so firm:

    Soll ich von außen den Thread anhalten und ExitInstance (mit enthaltenem AfxEndThread()) aufrufen?

    Ich kann mir alles gut vorstellen wenn ich nur eine Funktione benutze, aber so komm ich durcheinander. 😕 😞

    Wenn ich also innerhalb meines Thread-Obejktes AfxEndThread aufrufe, dann leite ich die Terminierung dieses Objektes ein, richtig?
    Es kommt aber nie zum Aufruf von ExitInstance und obwohl das VS2008 die Threads nicht mehr sieht bleiben doch die Speicherleaks übrig.



  • Martin Richter schrieb:

    EOP schrieb:

    AfxEndThread solltest du NIE benutzen!

    Stattdessen sooltest du eine message an den thread schicken, daß er sich beenden soll.
    Dieser reagiert dann mit ::PostQuitMessage(0); und sendet danach in ExitInstance eine message and den main thread, daß er sich beendet hat.

    1. AfxEndThread darf man benutzen. Es terminiert den aktuelen Thread.
    Besser ist jedoch einfach die Thread Funktion mit einem return zu verlassen-
    2. Warum soll man an einen Thread eine Nachricht senden, meistens haben die keine Message-Loop. Ein simples Flag tut es doch auch.

    AfxEndThread:
    http://www.google.com/search?name=f&hl=en&q=AfxEndThread+&sourceid=mozilla-search&start=0

    Never use AfxEndThread! [Archive] - CodeGuru Forums

    It is strongly recommended to avoid using AfxEndThread() function ... Hence AfxEndThread() call is not safe in terms of memory leaks when ...

    -> visualcpp.net
    -

    The only thing to understand about AfxEndThread is that you should never, ever use it. End
    of what you need to know.

    - Joseph M. Newcomer

    usw.

    Wenn er CWinThread ableitet, ist das denn nicht automatisch ein UI Thread mit message loop?


  • Mod

    1. AfxEndThread darf man aufrufen. Sicher muss man wissen was man tut. Dass z.B. auch Objekte des aktuellen Stacks nicht vernichtet werden, ist auch logo.
    Wie ich aber schrieb: Am besten einfach return aus der Thread Funktion.
    2. Wenn er von CWinThread ableitet, kann er alles in InitInstance machen und FALSE zurückgeben. Solange er nicht in InitInstance TRUE zurückgibt UND Run nicht überschreibt wird auch keine Message-Loop angelaufen...



  • Martin Richter schrieb:

    2. Wenn er von CWinThread ableitet, kann er alles in InitInstance machen und FALSE zurückgeben. Solange er nicht in InitInstance TRUE zurückgibt UND Run nicht überschreibt wird auch keine Message-Loop angelaufen...

    Danke, das wusste ich so nicht.



  • Nichtsdestotrotz:

    The only thing to understand about AfxEndThread is that you should never, ever use it. End of what you need to know.

    - Joseph M. Newcomer (= Guru)


  • Mod

    EOP schrieb:

    Nichtsdestotrotz:

    The only thing to understand about AfxEndThread is that you should never, ever use it. End of what you need to know.

    - Joseph M. Newcomer (= Guru)

    OK! Wenn Du Joseph auffährst gebe ich mich geschlagen... 😉



  • Martin Richter schrieb:

    EOP schrieb:

    Nichtsdestotrotz:

    The only thing to understand about AfxEndThread is that you should never, ever use it. End of what you need to know.

    - Joseph M. Newcomer (= Guru)

    OK! Wenn Du Joseph auffährst gebe ich mich geschlagen... 😉

    LOL, wusste ich doch wie ich dich krieg. 😃

    Ist aber wirklich ein Zitat von Joseph:
    http://www.databaseforum.info/2/25/d7abeb3a9f645d61.html
    http://www.tech-archive.net/Archive/VC/microsoft.public.vc.mfc/2005-01/0977.html


  • Mod

    EOP schrieb:

    Ist aber wirklich ein Zitat von Joseph:
    http://www.databaseforum.info/2/25/d7abeb3a9f645d61.html
    http://www.tech-archive.net/Archive/VC/microsoft.public.vc.mfc/2005-01/0977.html

    Ich weiß. Und ich gebe Dir recht.
    Es ist alles gesagt:
    1. Am Besten die Funktion mit einem return verlassen...
    2. Am Besten die Existenz von AfxEndThread vergessen!

    PS: Ich kenne Joseph persönlich als ich ihn vor Jahren in Redmond getroffen habe. Einmal hatte ich mit ihm eine längere Diskussion gehabt, ich habe daraus gelernt nie wieder mit ihm zu diskutieren 😉 (obwohl er nicht recht hatte SCNR).


Anmelden zum Antworten