Stack Overflow Problem



  • Hallo zusamen,

    ich arbeite mit Visual C++ 6.0 / MFC und habe folgendes Problem:
    Ich bekomme immer die Fehlermeldung, dass ich einen Stack Overflow bekomme,nur ich weiß nicht durch was.

    Beim starten eines Dialoges wird eine Funktion gestartet die daten aus einer Datenbank holt. Diese werden in einer dritten Funtion verarbeitet. Darin wird überprüft ob der Dialog noch geöffnet ist,falls ja wird die erste Funktion wieder gestartet und alles beginnt von vorne.

    BOOL CKlasse::OnInitDialog()
    {
       HoleDaten();
    }
    
    void CKlasse::HoleDaten()
    {
       globalerPointer->DatenausDatenbank();
    }
    
    void CKlasse2::DatenausDatenbank()
    {
      Holt Daten aus DB und übergibt diese an:
      globalerPointer->VerarbeiteDaten();
    }
    
    void CKlasse::VerarbeiteDaten()
    {
      verarbeitet Daten, und überprüft anschließend
      ob Dialog noch geöfnet ist (mit Hilfe eines Flags)
      wenn ja wird erste Funktion wieder aufgerufen und alles beginnt von vorne:
      HoleDaten();
    }
    

    Bin über jede Hilfe sehr dankbar!!!
    MfG



  • Du hast da eine nette kleine Endlosrekursion aufgebaut: HoleDaten() ruft DatenausDatenbank() ruft VerarbeiteDaten() ruft HoleDaten() ruft ... (und jeder Funktionsaufruf reserviert sich ein weiteres Stück des Stacks für lokale Variablen und Hilfsstrukturen)

    Ich schlage dir vor, das komplette Design zu überdenken und statt der Rekursion lieber eine Schleife zu verwenden:

    HoleDaten()
    {
      while(ready /*Flag-Abfrage, ob noch Daten erforderlich sind*/)
      {
        DatenausDatenbank();
        VerarbeiteDaten();
      }
    }
    


  • Ok ich versuchs mal..Vielen Dank fürs erste
    Falls ich nicht weiterkomme, schreibe ich einfach nochmal!

    Danke



  • So jetzt hab ich den Stack Overflow weg, dafür öffnet sich der Dialog nicht mehr...

    Alles was ich geändert habe:

    In der Funktion Holedaten()
    eine

    While(DialogOffen == 1)
    {
      DatenausDatenbank();
    }
    

    Damit ist der Stack Overflow weg...aber wie gesagt der Dialog öffnet sich nicht mehr...das Programm hängt sich auf!



  • Eventuell solltest du die HoleDaten()-Funktion aus der OnInitDialog() rausschmeißen auf einen späteren Zeitpunkt - der Dialog wird erst angezeigt, wenn die Init()-Methode durch ist, und die wird erst beendet, wenn du mit Daten holen fertig bist.

    (auch wenn's kompliziert erscheint, ich würde dir einen Zusatzthread für die Datenverarbeitung empfehlen)


Log in to reply