hauptnachrichtenschleife, wo startet man am besten einen thread?
-
PS:
OnInit() --> starten
OnDestroy() --> stoppen
-
hi, ich hab ja, aber ich weiss nicht ob du boost::thread kennst? hab den in der klasse CClient_GUIDlg, ich muss den also per konstruktor initialisieren, und wenn man das macht beginnt der thread auch schon zu laufen...
warum ist der boost::thread in der klasse, damit er vom destr. der klasse wieder gelöscht wird, weil ich ja im thread selber eine instanz erzeuge...
hmm....

cuBOOL CClient_GUIDlg::OnInitDialog() { CDialog::OnInitDialog(); ........ ........ return TRUE; // Geben Sie TRUE zurück, außer ein Steuerelement soll den Fokus erhalten } void CClient_GUIDlg::OnDestroy() { CDialog::OnDestroy(); // TODO: Add your message handler code here m_Popup.DestroyMenu(); }
-
naja es liegt doch an etwas anderem:
class CAboutDlg : public CDialog { public: CAboutDlg(); // Dialogfelddaten enum { IDD = IDD_ABOUTBOX }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV-Unterstützung // Implementierung protected: DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) END_MESSAGE_MAP() // CClient_GUIDlg Dialogfeld CClient_GUIDlg::CClient_GUIDlg(CWnd* pParent /*=NULL*/) : CDialog(CClient_GUIDlg::IDD, pParent) , m_onlineUser(0) , m_counter(0) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } // CClient_GUIDlg Meldungshandler 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 } void MessageReceiveThread() { } void SocketThread() { boost::thread thrd2(&MessageReceiveThread); //thrd2.join(); }hab nur mal die thread funktionen rein getan, ohne den thread zu starten!!!
wenn ich boost::thread thrd2(&MessageReceiveThread); drinnen habe und die GUI beende, dann bekomme ich: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 program '[2348] Client_GUI.exe: Native' has exited with code 2 (0x2).wenn ich boost::thread thrd2(&MessageReceiveThread); weg kommentiere und die GUI beende dann bekomm ich kein Memory leck!!!!
ist doch komisch????? versteh ich nicht!!!cu
-
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;-(
cuvoid 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;-(
cuvoid 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;-(
cuvoid 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;-(
cuvoid 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;-(
cuvoid 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;-(
cuvoid 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.htmlvielleicht 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