Stackoverflow beim aufrufen einer Funktion in der ein Fenster offen ist!
-
Jetzt wird komplex;
Ich empfange Daten über eine ServerSocket (oder ClientSocket). Diese werden dann im OnClientRead (OnServerRead) decodiert (Header (Stringlänge) auslesen). Nachdem es fertig decodiert ist wird eine weitere Funktion aufgerufen die die eigentlichen Strings verarbeitet, die Empfangen() Funktion.
Alles funktioniert einwandfrei ohne irgendwelche Fehler.
In dieser Empfangen Funktion wird im Falle eines Datentransfers ein SaveDialog Window aufgerufen um einen incoming Datatransfer zu speichern. Während dieses Window offen ist kann ein Paket empfangen werden. Die erste Funktion zerlegt das Paket wieder ordnungsgemäß und will die Empfangen Funktion aufrufen. Das geht aber nicht ich bekomme einen Stack Overflow! Warum???
Zwei weitere sonderbare Tatsachen;
Wenn ich die Funktionen im Debugger durchlaufe bekomme ich beim Aufrufen der Empfangen Funktion (Eben wenn ein SaveDialog oder OpenDialog Window offen ist) einen Stackoverflow. Dieser wird aber von der catch Schleife eingefangen. Gut, die Funktion (Datatransfer) wird dann abgebrochen aber das Programm läuft noch. Wenn ich das Programm ohne Debugger durchlaufe verschwindet bzw. stürzt es einfach ab.Früher hat der Datatransfer einwandfrei funktioniert (kein Stackoverflow) aber jetzt geht er nicht mehr. Ich weis jedoch leider nicht mehr was ich genau geändert habe damit es zu diesem Fehler kommt.
Achja; der Stackoverflow passiert eben jetzt wenn in der aufzurufenden Funktion entweder ein SaveDialog oder OpenDialog Fenster bzw. MsgDlg->ShowModal() aufrufe und ebendieses Fenster noch offen ist. (Wenn es wieder geschlossen ist funktioniert das Programm wieder ordentlich)
Hoffentlich könnt ihr mir helfen! Ich verstehe einfach nicht warum das Aufrufe eines Fensters dann zu so einem Stackoverflow führt!

-
Tja ich fürchte die einzige Lösungsmöglichkeit ist das Einlesen der Daten in einen Thread abzuspalten. Ursache wird wohl sein, dass die Dialoge modal aufgerufen werden. Solange modale Dialoge offen sind, führt das Programm keine anderen Funktionen aus.
-
Oje. Du meinst das ich jetzt jedes Fenster das ich aufrufe muss in einem eigenen Thread stehen?? Das wird verdammt schwer.
Aber warum ist es dann früher gegangen?
-
Nein, ich meinte nur die On...Read-Funktionen müssen in einen Thread ausgelagert werden. Ein Thread läuft unabhängig von der App., deshalb läuft er weiter, auch wenn ein modales Form aufgerufen wird.
Wenn öffnest Du den SaveDialog denn? (Ist der überhaupt modal?) Notfalls versuch doch mal, die Daten zuerst komplett in einen Puffer zu schreiben und erst wenn die Übertragung komplett ist, den SaveDialog zu öffnen...
Was hast Du denn alles geändert, seit es noch funktinierte?
-
Joe_M. schrieb:
Was hast Du denn alles geändert, seit es noch funktinierte?
Sehr viel. Deswegen weis ich nicht an was das Problem liegt.
Joe_M. schrieb:
Wenn öffnest Du den SaveDialog denn? (Ist der überhaupt modal?) Notfalls versuch doch mal, die Daten zuerst komplett in einen Puffer zu schreiben und erst wenn die Übertragung komplett ist, den SaveDialog zu öffnen...
Die Übertragung für den Datentransfer ist dann schon beendet, aber es werden einfach andere (chat) Pakete übermittelt.
Joe_M. schrieb:
Nein, ich meinte nur die On...Read-Funktionen müssen in einen Thread ausgelagert werden. Ein Thread läuft unabhängig von der App., deshalb läuft er weiter, auch wenn ein modales Form aufgerufen wird.
Der Fehler passiert ja wenn ich die Empfangen Funktion aufrufe und nicht OnRead! Und wenn ich dann Empfangen aufrufe kommt doch wieder der Bug??!
-
Schau mal - beim Auftreten des Stack Overflows - in das Calling-Stack window...
Da findest du alle Funktionsaufrufe die aktuell auf dem stack liegen..-junix
-
Also ich kann da nichts auslesen;
Empfangen(); Protokoll(); //Diese Funktion wird im ServerSocketClientRead aufgerufen ServerSocketClientRead(); //Empfangen der msg (im Socket onclientread) TServerWinSocket::ClientRead; TCustomWinSocket::EventWeiter unten sind dann ziemlich viele
C:\Windows\system32\user32.dll
Ich habe sowas noch nie analysiert daher kann ich da auch nichts deuten..
-
Heureka!!
Ich habe einfach einmal die Größe des Stacks auf die mögliche Maximalgröße verändert und siehe da, auf einmal gibt es keinen Stack Overflow mehr!
-
Kann das irgendwelche Nachteile haben wenn ich die Stackgröße auf den maximal Wert stelle??
Wie groß ist der Stack überhaupt auf einem Rechner??
Ich kenn mich in Sachen Stack nur im Gebiet der µC's aus.