Announcement

Collapse
No announcement yet.

Kann ein Record freigegeben werden?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Kann ein Record freigegeben werden?

    Hallo zusammen,

    ich schreibe ein Programm, das ein "Array of MyRecord" beeinhaltet. Über setLength verändere ich die Grösse dynamisch und lösche sogar am Schluss alle Variablen darin, um dann mit copy die Grösse auf 0 zu setzen. Trotzdem habe ich das Problem, dass bei mehrmaligen Ausführen des Programmes (egal ob schon wieder geschlossen oder immer noch geöffnet) mein Rechner immer langsamer wird.
    Es kam sogar schon soweit, dass mir XP nach eingen Durchläufen mitteilte, dass zuwenig virtueller Speicher vorhanden ist.
    Ist das Problem auf das Record zurückzuführen, oder liegt das Problem an anderer Stelle (ausser vor'm PC)?
    Hat jemand eine Antwort auf mein Frage? Danke im Voraus!

  • #2
    Kommt darauf an wie das record definiert ist. Zeig mal her

    Comment


    • #3
      Hallo Herr Marquardt,

      anbei, wie ich es definiert habe ...
      <PRE>
      type
      TDaten = record
      Name: ShortString;
      GerCon1: ShortString;
      GerCon2: ShortString;
      Modul1: ShortString;
      Modul2: ShortString;
      Modul3: ShortString;
      Modul4: ShortString;
      Modul5: ShortString;
      Modul6: ShortString;
      Bemerkung: ShortString;
      LCoss: ShortString;
      Aun: ShortString;
      AulExt: ShortString;
      Chese: ShortString;
      Zuord: ShortString;
      Typ: ShortString;
      TAPRO: ShortString;
      SG: ShortString;
      COSSU: ShortString;
      SA: ShortString;
      Agent: ShortString;
      Lage: ShortString;
      end;
      TTLN = Record
      RNR: ShortString;
      Daten: TDaten;
      end;
      ...
      var
      TLN: array of TTLN;
      ...
      setLength(TLN,j);
      TLN[j-1].RNR:= MML_Command1.getParamByName('TLNNU',_German);
      TLN[j-1].Daten.GerCon1:= MML_Command1.getParamByName('GERKON',_German);
      ...
      for i:= 0 to high(TLN) do begin
      with TLN[i] do begin
      RNR:= '';
      Daten.GerCon1:= '';
      ...
      end;
      end;
      TLN:= copy(TLN,0,0);
      ...
      end;
      ...
      end;
      </PRE>

      Ich hoffe es ist übersichtlich genug, danke nochmals!
      Gruss Peter Wol

      Comment


      • #4
        Hallo zusammen,

        hat ausser Herrn Marquardt keine Hinweise zu meinem Problem?
        Danke im Voraus!

        Gruss Peter Wol

        Comment


        • #5
          Hallo,<br>
          schon mal setlength(TLN,0) probiert anstelle von TLN:=copy(TLN,0,0)?<br&gt

          Comment


          • #6
            Hallo Peter,

            hier gab es irgendwo schon mal ein Posting zu einem ähnlichen Thema. Dort stellte sich heraus, daß es die Verwendung von ShortString an sich war, die das Problem verursacht hat. Wenn ich mich richtig erinnere, ist es eine Eigenart von ShortString, daß sie immer eine bestimmte Länge Speícher reservieren, egal wieviele Bytes in dem ShortString verwendet werden. Ich würde mal ShortString komplett durch AnsiString ersetzen. Diese handhaben die Speicherallozierung dynamisch. Somit sollte sich der grundsätzliche Speicherbedarf des Programms verringern, da nur der tatsächlich benötigte Speicher verwendet wird. Somit sollte dann auch der Speichermanager weniger Probleme haben, entsprechend große, freie (zusammenhängende) Speicherbereiche zu finden, was auch die Probleme mit dem ungenügenden virtuellen Speicher bereinigen könnte.

            Grüße Joche

            Comment


            • #7
              TLN := ni

              Comment


              • #8
                @Siegbert: wenn das das Delphi-Äquivalent zum C++ 'delete TLN;' ist, funktioniert das...

                @Peter: Trotzdem solltest Du in Erwägung ziehen auf AnsiString umzustellen. m.E. belegt ein ShortString grundsätzlich 255 Byte, egal wie viele davon tatsächlich genutzt werden.

                Grüße Joche

                Comment


                • #9
                  Hallo @all,

                  danke für die Tipps und Hinweise.
                  Werde ich heute abend ausprobieren. Werde noch ein Feedback geben.

                  Gruss Peter Wol

                  Comment


                  • #10
                    Hallo zusammen,

                    also, die Tipps haben "gezogen". Ich habe folgende zwei verwendet:
                    AnsiString statt ShortString und
                    TLN:= nil;

                    Danke nochmal an alle, die sich mit meinem Problem beschäftigt haben.

                    Gruss Pete

                    Comment

                    Working...
                    X