hauptnachrichtenschleife, wo startet man am besten einen thread?



  • Das join() ist nicht dafür da um den Thread zu starten, sondern um dem Thread beizutreten. Ist z.B. nützlich wenn man warten will, bis der Thread beendet ist. Was aber bei dir ja nicht der Fall ist?

    Der Thread wird gestartet, sobald du ein boost::thread instanzierst, was ja mit der Zeile boost::thread thrd2(&MessageReceiveThread); der Fall ist.

    Da du thrd2 auf dem Stack instanzierst, wird thrd2 auch autom. gelöscht, wenn SocketThread() verlassen wird! (Somit hinterlässt thrd2 kein Leck)

    Da MessageReceiveThread() aber leer ist, ist die Beendigung von thrd2 auch umgehend im nächsten Moment der Fall. Alles geht ruck zuck vorbei, thrd2 lebt nicht gerade lange. 😉

    Du muß in MessageReceiveThread() irgend eine dauerhafte Aufgabe einbauen (Schleife o.ä.) und das join() auch weglassen. Weiterhin würde ich thrd2 dynamisch auf dem Heap instazieren, damit der Thread nicht bei verlassen von SocketThred() zerstört wird. Am besten in deiner Klasse ein boost::thread *thrd2 als Member anlegen.



  • Das join() ist nicht dafür da um den Thread zu starten, sondern um dem Thread beizutreten. Ist z.B. nützlich wenn man warten will, bis der Thread beendet ist. Was aber bei dir ja nicht der Fall ist?

    naja join ist auch auskommentiert;-)

    Du muß in MessageReceiveThread() irgend eine dauerhafte Aufgabe einbauen (Schleife o.ä.) und das join() auch weglassen. Weiterhin würde ich thrd2 dynamisch auf dem Heap instazieren, damit der Thread nicht bei verlassen von SocketThred() zerstört wird. Am besten in deiner Klasse ein boost::thread *thrd2 als Member anlegen.

    schau dir das jetzt mal an:
    hab noch immer ein Speicherleck;-( aber beide threads leben jetzt bis zum ende!! hm...
    ja dynamisch anlegen, aber wo? brauch ja dann auch noch ein delete...

    void MessageReceiveThread()
    {
    	std::string buffer;
    
    	while(1)
    	{
    	}
    }
    
    void SocketThread()
    {
    
    	boost::thread thrd2(&MessageReceiveThread);
    
    	while(1)
    	{
    	}
    }
    
    BOOL CClient_GUIDlg::OnInitDialog()
    {
    	CDialog::OnInitDialog();
    
    	// Hinzufügen des Menübefehls "Info..." zum Systemmenü.
    
    	......
            ......
    
    	boost::thread thrd1(&SocketThread);
    
    	return TRUE;  // Geben Sie TRUE zurück, außer ein Steuerelement soll den Fokus erhalten
    }
    


  • warum funktioniert dsa nicht? langsam verzweifle ich;-(
    cu

    void SocketThread()
    {
    	while(1)
    	{
    	}
    }
    
    BOOL CClient_GUIDlg::OnInitDialog()
    {
    	CDialog::OnInitDialog();
    
    	// Hinzufügen des Menübefehls "Info..." zum Systemmenü.
    
             std::auto_ptr<boost::thread>(new boost::thread(&SocketThread));
    
    	return TRUE;  // Geben Sie TRUE zurück, außer ein Steuerelement soll den Fokus erhalten
    }
    


  • warum funktioniert dsa nicht? langsam verzweifle ich;-(
    cu

    void SocketThread()
    {
    	while(1)
    	{
    	}
    }
    
    BOOL CClient_GUIDlg::OnInitDialog()
    {
    	CDialog::OnInitDialog();
    
    	// Hinzufügen des Menübefehls "Info..." zum Systemmenü.
    
             std::auto_ptr<boost::thread>(new boost::thread(&SocketThread));
    
    	return TRUE;  // Geben Sie TRUE zurück, außer ein Steuerelement soll den Fokus erhalten
    }
    


  • warum funktioniert dsa nicht? langsam verzweifle ich;-(
    cu

    void SocketThread()
    {
    	while(1)
    	{
    	}
    }
    
    BOOL CClient_GUIDlg::OnInitDialog()
    {
    	CDialog::OnInitDialog();
    
    	// Hinzufügen des Menübefehls "Info..." zum Systemmenü.
    
             std::auto_ptr<boost::thread>(new boost::thread(&SocketThread));
    
    	return TRUE;  // Geben Sie TRUE zurück, außer ein Steuerelement soll den Fokus erhalten
    }
    


  • warum funktioniert dsa nicht? langsam verzweifle ich;-(
    cu

    void SocketThread()
    {
    	while(1)
    	{
    	}
    }
    
    BOOL CClient_GUIDlg::OnInitDialog()
    {
    	CDialog::OnInitDialog();
    
    	// Hinzufügen des Menübefehls "Info..." zum Systemmenü.
    
             std::auto_ptr<boost::thread>(new boost::thread(&SocketThread));
    
    	return TRUE;  // Geben Sie TRUE zurück, außer ein Steuerelement soll den Fokus erhalten
    }
    


  • warum funktioniert dsa nicht? langsam verzweifle ich;-(
    cu

    void SocketThread()
    {
    	while(1)
    	{
    	}
    }
    
    BOOL CClient_GUIDlg::OnInitDialog()
    {
    	CDialog::OnInitDialog();
    
    	// Hinzufügen des Menübefehls "Info..." zum Systemmenü.
    
             std::auto_ptr<boost::thread>(new boost::thread(&SocketThread));
    
    	return TRUE;  // Geben Sie TRUE zurück, außer ein Steuerelement soll den Fokus erhalten
    }
    


  • warum funktioniert das nicht, bekomme beim beenden der GUI wieder ein speicheleck!!!? hab nun den thread am heap angelegt...langsam verzweifle ich;-(
    cu

    void SocketThread()
    {
    	while(1)
    	{
    	}
    }
    
    BOOL CClient_GUIDlg::OnInitDialog()
    {
    	CDialog::OnInitDialog();
    
    	// Hinzufügen des Menübefehls "Info..." zum Systemmenü.
    
             std::auto_ptr<boost::thread>(new boost::thread(&SocketThread));
    
    	return TRUE;  // Geben Sie TRUE zurück, außer ein Steuerelement soll den Fokus erhalten
    }
    


  • jemand ne idee?
    cu



  • Eine Frage: Wie stellst du denn das Speicherleck fest? Woran erkennst du das?



  • Artchi schrieb:

    Eine Frage: Wie stellst du denn das Speicherleck fest? Woran erkennst du das?

    wahrscheinlich debugmode

    und da beim programmbeenden muss ja unten

    programm wurde mit 0x00 beendet dranstehen.

    wenn speicherlecks steht davor irgendwas mit

    BLOCK dann die hexzahlen wo halt



  • hm...ich weiss nicht mehr weiter;-(
    ja im debug modus steht da beim beenden der GUI:

    'Client_GUI.exe': Loaded 'C:\Client_GUI.exe', Symbols loaded.
    'Client_GUI.exe': Loaded 'C:\WINDOWS\SYSTEM32\ntdll.dll', No symbols loaded.
    'Client_GUI.exe': Loaded 'C:\WINDOWS\SYSTEM32\kernel32.dll', No symbols loaded.
    'Client_GUI.exe': Loaded 'C:\WINDOWS\SYSTEM32\mfc71d.dll', Symbols loaded.
    'Client_GUI.exe': Loaded 'C:\WINDOWS\SYSTEM32\msvcr71d.dll', Symbols loaded.
    'Client_GUI.exe': Loaded 'C:\WINDOWS\SYSTEM32\gdi32.dll', No symbols loaded.
    'Client_GUI.exe': Loaded 'C:\WINDOWS\SYSTEM32\user32.dll', No symbols loaded.
    'Client_GUI.exe': Loaded 'C:\WINDOWS\SYSTEM32\ADVAPI32.DLL', No symbols loaded.
    'Client_GUI.exe': Loaded 'C:\WINDOWS\SYSTEM32\RPCRT4.DLL', No symbols loaded.
    'Client_GUI.exe': Loaded 'C:\WINDOWS\SYSTEM32\SHLWAPI.DLL', No symbols loaded.
    'Client_GUI.exe': Loaded 'C:\WINDOWS\SYSTEM32\MSVCRT.DLL', No symbols loaded.
    'Client_GUI.exe': Loaded 'C:\WINDOWS\SYSTEM32\COMCTL32.DLL', No symbols loaded.
    'Client_GUI.exe': Loaded 'C:\WINDOWS\SYSTEM32\OLEAUT32.DLL', No symbols loaded.
    'Client_GUI.exe': Loaded 'C:\WINDOWS\SYSTEM32\ole32.dll', No symbols loaded.
    'Client_GUI.exe': Loaded 'C:\WINDOWS\SYSTEM32\msvcp71d.dll', Symbols loaded.
    'Client_GUI.exe': Loaded 'C:\WINDOWS\SYSTEM32\WS2_32.DLL', No symbols loaded.
    'Client_GUI.exe': Loaded 'C:\WINDOWS\SYSTEM32\WS2HELP.DLL', No symbols loaded.
    'Client_GUI.exe': Loaded 'C:\Informatik\Informatik_Project\Client_GUI\Debug\boost_thread-vc71-mt-gd-1_32.dll', No symbols loaded.
    'Client_GUI.exe': Loaded 'C:\WINDOWS\SYSTEM32\MFC71DEU.DLL', No symbols loaded.
    'Client_GUI.exe': Loaded 'C:\WINDOWS\SYSTEM32\UXTHEME.DLL', No symbols loaded.
    'Client_GUI.exe': Loaded 'C:\Programme\Gemeinsame Dateien\Symantec Shared\AntiSpam\ASOEHOOK.DLL', No symbols loaded.
    'Client_GUI.exe': Loaded 'C:\WINDOWS\SYSTEM32\msvcr71.dll', Symbols loaded.
    'Client_GUI.exe': Loaded 'C:\WINDOWS\SYSTEM32\MSCTF.DLL', No symbols loaded.
    Detected memory leaks!
    Dumping objects ->
    {142} normal block at 0x00326640, 24 bytes long.
     Data: <He              > 48 65 14 00 FF FF FF FF 00 00 00 00 00 00 00 00 
    {141} normal block at 0x003267D8, 8 bytes long.
     Data: <@f2     > 40 66 32 00 01 CD CD CD 
    Object dump complete.
    The thread 'Win32 Thread' (0xbb4) has exited with code 2 (0x2).
    The program '[2144] Client_GUI.exe: Native' has exited with code 2 (0x2).
    


  • hi!
    ich poste mal die: Client_GUIDlg.cpp
    http://www.rafb.net/paste/results/hvzlWp67.html

    vielleicht könnt ihr ja was erkennen...

    cu



  • hallo,
    jemand ne idee was man da machen kann?

    bye



  • Du musst einfach den Thread beenden bevor du das Programm beendest.

    --> thread.join(); // wartet auf Threadende

    Problem ist nur:

    void SocketThread()
    {
    while(1)
    {
    }
    }
    // <--- auf das ende wartest du ewig.

    Du musst eine variable (bool) für des Ende erstellen.
    Auf diese Variable nur über boost::mutex zugreifen.
    Anschließend kannste die zum beenden gleich true setzen um die While schleife zu beenden.

    cu ralf


Anmelden zum Antworten