RAM Probleme abfangen



  • Hallo,

    gibt es irgend eine Problembehebung über try-catch, mit dem man das Programm vor Arbeitsspeicher-Problemen bewaren kann?

    In meinem Programm wird eine Datei ausgelesen und legt je nach dem wie viel in der Datei steht x Steuerelemente an. Wenn dies jedoch zu viel werden dann packt das der Arbeitsspeicher nicht und das Programm bzw. das Formular bleibt hängen.

    Danke für die Hilfe!



  • zeig mal deine funktion die du zum erstellen der steuerelemente verwendest!



  • Ich hab das so gemacht:

    const int x = 500;    
    TLabel *Anlegerdaten[x];
    TMemo  *Hinweis[x];
    int KompoNr = 0;
    //... Und noch ein paar Steuerelemente
    
    TStringList *db;
    TStringList *Beschreibung;
    String Anleger;
    String Datum;
    int Zeilen;
    
    db = new TStringList;
    Beschreibung = new TStringList;
    
    db->LoadFromFile(Datenbankdatei);
    
    for(int k = 0; k<db->Count; k++)
    {
      Anleger = db->Strings[k];
      k++;
      Datum = db->Strings[k];
      k++;
      //... usw.
    
      KompoNr++;
      Anlegerdaten[KompoNr] = new TLabel(Form1->Frame1);
      Anlegerdaten[KompoNr]->Parent = Form1->Frame1;
      Anlegerdaten[KompoNr]->Top = KompoNr*50;
      Anlegerdaten[KompoNr]->Caption = "Anleger: " + Anleger + "\nDatum: " + Datum;
      //... Und noch weitere Einstellungen
    
      Hinweis[KompoNr] = new TMemo(Form1->Frame1);
      Hinweis[KompoNr]->Parent = Form1->Frame1;
      Hinweis[KompoNr]->Top = KompoNr * 50;
      Hinweis[KompoNr]->Lines = Beschreibung;
      //...
    }
    delete db;
    

    Ich weiß. 500 Kompos pro Kompo können etwas viel sein. Aber nicht für jeden Speicher. Deshalb wollte ich das nicht die Konstante Übernehmen lassen, sondern einer try-catch Version, die das Anlegen der Steuerelemente überwacht und notfalls das Anlegen abbricht.



  • hi,

    es ist keine gute Lösung eine Exception herauszufordern.
    Es gibt immer Lösungen derartige Probleme bereits im Vorfeld zu umgehen, was man auch immer machen sollte.
    Zum beispiel ist es sowieso nicht unbedingt das praktischte sowas in solche Arrays zu packen. Besser wäre ne List oder ein vector. Dann kann man auch die maximale größe abfragen:

    #include <vector>
    using namespace std;
    //....
    std::vector<TLabel*> VLabel;
    ShowMessage(IntToStr(max_size()));
    
    // eintüten kann man so:
    while(VLabel.size()<VLabel.max_size()) 
    {
      TLabel* ALabel=new TLabel(NULL);
      VLabel.push_back(ALabel);
    }
    // delete später nicht vergessen !
    

    ähm, ist ungetestet, da ich sowas nicht freiwillig auf mein Rechner mache 😉

    [ Dieser Beitrag wurde am 02.06.2003 um 22:46 Uhr von AndreasW editiert. ]



  • Danke für die Hilfe! Werde ich ausprobieren.



  • Ausserdem scheint ein grundsätzliches Designproblem vorzuliegen. Wozu brauchst du gleichzeitig 500 Memos, 500 Label usw.? Die kann der Benutzer doch sowieso nicht auf einmal sehen!?



  • och, wenn sein Scrollbalken 5 Meter lang ist schon 😃


Anmelden zum Antworten