Programm beendet im Release nicht
-
Hallo zusammen,
ich hab ein Programm geschrieben, welches im Debug-Modus kompiliert einwandfrei funktioniert und beendet. Im Release-Modus dagegegen beendet es nicht sondert das Fenster bleibt eingefroren.
Wie kann ich den Grund dafür finden?
Danke
Jogi
-
Debug Symbole mit erzeugen lassen und im Release Mode debuggen.
-
Danke für den Hinweis... Noch eine Frage: Wie mach ich das

-
Unter Projekt->Einstellungen wählst du die Release-Konfiguration aus (sollte eigentlich aktiv sein), schaltest auf den Tab "C/C++" und setzt das Häkchen vor "Browse-Info generieren" und wählst eine Option deiner Wahl bei "Debug-Info:". Dann kannst du das Programm neu compilieren und ausführen lassen.
-
Ist das in Visual Studion 2005 auch so? Denn dort finde ich kein Häkchen... "Informationen durchsuchen" hab ich gefunden... aber das ist glaube ich nicht richtig.
-
Ja!
Projekt Einstellungen dann C++ -> Debug -> Debug Information Format unter den Linker Einstellungen -> Debugging -> Gernerate Debug Info
-
Danke jetzt hab ich es auch soweit das es im Release beendet... Aber der Fehler ist sehr eigenartig.
Ich hab zwei Threads laufen und in meinem Programm ruft der eine Thread bei dem anderen Objekt eine Methode auf, um dessen Thread zu beenden.
Vereinfacht sieht das so aus:
void CBerechnung::End() { if (m_bWorking) { m_bWorking = FALSE; // Auf das Ende der Thread-Methode warten while (m_pThread != NULL) { }; } }Die eigentliche Berechnung läuft in einer Methode (in einem anderen Thread)
void CBerechnung::Berechnung() { m_bWorking = TRUE; while (m_bWorking) { // Hier wird nun berechnet } // Thread auf NULL setzen, m_bAutoDelete führt // dazu das der Speicher freigegeben wird m_pThread = NULL; }Die Berechnung selber wird über eine Wrappermethode gestartet
void StartThread() { m_pThread = ::AfxBeginThread((AFX_THREADPROC) CBerechnung::StartWrapper, (LPVOID) this, 0, 0, 0, 0); } static int StartWrapper(LPVOID pWho) { return static_cast<CBerechnung*>(pWho)->Berechnung(); };Mit dem oben angegeben funktioniert es nicht. Erst wenn ich es mit einem Sleep(0) in der while-Schleife schreibe wird der Thread beendet bzw. funktioniert wieder alles.
void CBerechnung::End() { if (m_bWorking) { m_bWorking = FALSE; // Auf das Ende der Thread-Methode warten while (m_pThread != NULL) { Sleep(0); }; } }Kann mir das jemand erklären :)? Danke für jeden Versuch.
PS: Dazu hab ich direkt noch eine Frage. Muss ich die beiden Variablen m_bWorking und m_pThread absichern (also per Semaphoren) oder ist sichergestellt, dass das Setzen und Auslesen in einem Rutsch erfolgt, da es ja "Standardtypen" sind? Auch hierfür danke

-
Vermutlich hat der Compiler die (leere) Schleife einfach weg-optimiert

Aber auf das Thread-Ende solltest du lieber mit Systemmitteln warten (WaitForSingleObject()), das ist sicherer und eleganter - und du mußt die Variable nicht mehr selber anfassen. Ansonsten: Ja, m_bWorking solltest du absichern, m_pThread muß der Thread selber gar nicht anfassen.
-
Aber auf das Thread-Ende solltest du lieber mit Systemmitteln warten (WaitForSingleObject()), das ist sicherer und eleganter - und du mußt die Variable nicht mehr selber anfassen. Ansonsten: Ja, m_bWorking solltest du absichern, m_pThread muß der Thread selber gar nicht anfassen.
Danke für den Hinweis... Hab ich direkt mal umgesetzt :)... aber hätte ich das direkt so gemacht hätte ich ja nie den Fehler im Release gehabt
und nichts neues gelernt ;).Nochmal danke für den Hinweis!