Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Nicht freigegebene Variabeln suchen (https://www.delphipraxis.net/6580-nicht-freigegebene-variabeln-suchen.html)

moritz 15. Jul 2003 19:00


Nicht freigegebene Variabeln suchen
 
Hi

Ich habe ein Problem mit einem Programm von mir:
Es gibt ein paar Funktionen, die regelmäßig aufgerufen werden. Und komischerweiße steigt der Speicherverbrauch die ganze Zeit an.
1)An was kann das liegen
2)Gibt es ein Programm, dass Variabeln sucht, die nicht freigegeben wurden?

Stanlay Hanks 15. Jul 2003 19:51

Re: Nicht freigegebene Variabeln suchen
 
Dann poste doch mal diese Funktionen, die regelmäßig aufgerufen werden. Reservierst du irgendwie manuell Speicher? Schau dir doch einfach mal besagte Funktionen an, und wenn du nicht weiterkommst, poste sie.

Bis dann. Man liest sich, Stanlay :hi:

Alexander 15. Jul 2003 19:58

Re: Nicht freigegebene Variabeln suchen
 
Mit FreeMem solltest du Speicher wieder freigeben können, den du mit zb mit GetMem reserviert hast. Vielleicht hilft es ja was.
Mehr Hilfe kann man dir wohl erst mit dem nötigen Source geben

moritz 15. Jul 2003 19:58

Re: Nicht freigegebene Variabeln suchen
 
Ich hab sie mir angeschaut, auch schon mit MemProof(Das ich noch nicht ganz auszuwerten verstehe...), komme aber nich drauf.
Ich müsse hier sehr viel Code posten, da es viele verkapselte Funktionen sind. Und irgendwie werde ich daraus nicht schlau

Christian Seehase 15. Jul 2003 20:00

Re: Nicht freigegebene Variabeln suchen
 
Moin Onz,

Du kannst hier auch Attachements anhängen, der Code müsste also nicht direkt in's Posting.

moritz 15. Jul 2003 20:05

Re: Nicht freigegebene Variabeln suchen
 
Ich weiß, aber seid mir noch böse, dass ich nicht den ganzen Code veröffentlichen will.

Also, hier sind die Ausschnitte:

Code:
{###########################################################}
{###########################################################}
      procedure TProg.RememberTimerTimer(Sender: TObject);

      Var      i       :    Integer;

                DL:            Integer;

                Rem:           Boolean;

                UpdateCheck:   TStringList;

                Ro:            BirthdayRememberFunktionen.TOptionenOps;

      begin

            Rem:=false;

            RememberTimer.Interval:=5000;

            RO:=ReadOptions(ExtractFileDir(Prog.GebRemDir)+'\options.ini');

            Liste2.Clear;

            ReadData(Liste2,GebRemDir);

            if LastColumn<>nil then

            begin

                  if LastDir then LastDir:=false else LastDir:=true;

                  ListeColumnClick(Prog,LastColumn);

            end;

            If Liste2.Items.Count=0 Then

            begin

                  Exit;

            end;

            For i:=0 to Liste2.Items.Count-1 do

            Begin

                  if Length(Liste2.Items[i].SubItems[0])=6 then

                        DL:=DaysLeft(DayOf(StrToDate(Liste2.Items[i].SubItems[0]+IntToStr(YearOf(Now)-1))),MonthOf(StrToDate(Liste2.Items[i].SubItems[0]+IntToStr(YearOf(Now)-1))),YearOf(Now)-1)

                  else

                        DL:=DaysLeft(DayOf(StrToDate(Liste2.Items[i].SubItems[0])),MonthOf(StrToDate(Liste2.Items[i].SubItems[0])),YearOf(StrToDate(Liste2.Items[i].SubItems[0])));

                  If ((Liste2.Items[i].SubItems[2]='In drei Wochen')and(Ro.wann[0]))or
                     ((Liste2.Items[i].SubItems[2]='In zwei Wochen')and(Ro.wann[1]))or
                     ((Liste2.Items[i].SubItems[2]='In einer Woche')and(Ro.wann[2]))or
                     ((Liste2.Items[I].SubItems[2]='In 5 Tagen')and(Ro.wann[3]))or
                     ((Liste2.Items[I].SubItems[2]='Übermorgen')and(Ro.wann[4]))or
                     ((Liste2.Items[i].SubItems[2]='Morgen')and(Ro.wann[5]))or
                     ((Pos('##3WO##',Liste2.Items[i].SubItems[3])<>0)and(DL=21))or
                     ((Pos('##2WO##',Liste2.Items[i].SubItems[3])<>0)and(DL=14))or
                     ((Pos('##1WO##',Liste2.Items[i].SubItems[3])<>0)and(DL=7))or
                     ((Liste2.Items[i].SubItems[2]='Heute')and(Ro.wann[6]))then

                     begin

                            Rem:=true;

                            Application.ProcessMessages;

                            if (Pos('##3WO##',Liste2.Items[i].SubItems[3])<>0) then

                                  Remember(Liste2.Items[I].Caption,'In drei Wochen',Liste2.Items[i].SubItems[0],false)

                            else

                            if (Pos('##2WO##',Liste2.Items[i].SubItems[3])<>0) then

                                  Remember(Liste2.Items[I].Caption,'In zwei Wochen',Liste2.Items[i].SubItems[0],false)

                            else

                            if (Pos('##1WO##',Liste2.Items[i].SubItems[3])<>0) then

                                  Remember(Liste2.Items[I].Caption,'In einer Wochen',Liste2.Items[i].SubItems[0],false)

                            else


                                  Remember(Liste2.Items[I].Caption,Liste2.Items[i].SubItems[2],Liste2.Items[i].SubItems[0],false);

                     end;

            End;

            if (Prog.enabled)and(ParamStr(1)='los')and(AlUpdatecheck)and(ReadOptions(ExtractFileDir(GebRemDir)+'\options.ini').onlycheck) then

            begin

                  Prog.Close;

                  Application.Terminate;

                  Halt;

            end;

            If (Rem=False)and(AlUpdatecheck=false) then

            begin

                        UpdateCheck:=TStringList.Create;

                        UpDateCheck.AddStrings(UpdateAviable); //Daran liegts nicht!

                        if UpdateCheck[0]='TRUE' then

                        Begin

                              Prog.Show;

                              SwitchToThisWindow(Prog.handle, True);

                              If MessageDlg('Es existiert folgende, neuere Version von BirthdayRemember:'+#10+'Version: '+UpdateCheck[1]+#10+'Erscheinungsdatum: '+UpdateCheck[2]+#10+'Download-Url: '+UpdateCheck[3]+#10+'Soll diese nun downgeloadet werden?',mtConfirmation,[mbYes,mbNo],0)=mrYes then

                              Begin

                                    ShellExecute(handle,'open',PChar(UpdateCheck[3]), nil,nil,sw_show);

                              End ELSE

                              Begin

                                    messagedlg('Sie können die Version manuell auf [url]http://www.BirthdayRemember.de[/url] updaten',mtInformation,[mbOk],0);

                              End;

                        End;

                        AlUpdatecheck:=true;

            end;

            UpdateCheck.Free;

      end;
{###########################################################}
{###########################################################}


{###########################################################}
{###########################################################}
{Errechnet die restlichen Tage bis zu einem Datum}
      function DaysLeft(day,month,year: integer):integer;

      var nextGeb:        TDate;

      begin

            nextGeb:=EncodeDate(YearOf(Now)+1,month,day);

            result:=DaysBetween(Now,nextGeb);

            while result>=DaysInYear(Now) do

               result:=result-DaysInYear(Now);

      end;
{###########################################################}
{###########################################################}



{###########################################################}
{###########################################################}
      procedure TProg.ReadData(Liste: TListView;datei: String);

      var Ini:       TMemIniFile;

          Namen:     TStringList;

          I:         Integer;

          Item:      TListItem;

      begin

              {Datei auf Fehler prüfen}
              CheckBrFile(datei);

              //Datei öffnen
              ini:=TMemIniFile.Create(datei);

              Namen:=TStringList.Create;

              //Sections(Namen) in TStringList laden
              ini.ReadSections(Namen);

              //Wenn noch keine Einträge
              if Namen.count=0 then

                    exit;    //Raus

              //Alle abarbeiten
              For I:=0 to Namen.Count-1 do

              begin

                      {Item hinzufügen}
                      item:=Liste.Items.Add;

                      {Name auf das erste Feld}
                      item.Caption:=namen[i];

                      {Geburtstag auf das zweite Feld}
                      if copy(ini.ReadString(Namen[i],'gebtag','01.01.2000'),7,4)='9999' then

                            item.SubItems.Add(copy(ini.ReadString(Namen[i],'gebtag','01.01.2000'),0,6))

                      else

                            item.SubItems.Add(ini.ReadString(Namen[i],'gebtag','01.01.2000'));

                      {Alter aufs dritte Feld}
                      item.SubItems.Add(Alter(ini.ReadString(Namen[i],'gebtag','1.1.2002')));

                      {Zeit bis dorthin aufs vierte Feld}
                      item.Subitems.Add(ZeitBis(StrToDate(ini.ReadString(Namen[i],'gebtag','01.01.2000'))));

                      {Bemerkung aufs fünfte Feld}
                      item.SubItems.Add(ini.ReadString(Namen[i],'bem','(Keine)'));

                      Application.processMessages;

              end;

              Ini.Free;

              Namen.Free;

      end;
{###########################################################}
{###########################################################}
Sollte alles gewesen sein.

Christian Seehase 15. Jul 2003 20:24

Re: Nicht freigegebene Variabeln suchen
 
Moin Onz,

also als erstes würde ich mal den Timer zu Beginn des OnTimer ab- und am Ende wieder einschalten, denn wenn die Abarbeitung länger läuft, als das Interval eingestellt ist, werden die Objekte immer wieder neu erstellt, bevor sie freigegeben werden.

Dann solltest Du Dir angewöhnen nach dem Erzeugen eines Objektes einen try/finally Block zu benutzen, wobei im finally Abschnitt das Objekt wieder freigegeben wird. Am Besten mit FreeAndNil, damit anschliessend erkannt werden kann (z.B. if Objektvariable = nil then), dass diese kein Objekt mehr enthält.

Dein Objekt UpdateCheck wird z.b. an der falschen Stelle wieder freigegeben. Das Freigeben gehört unmittelbar hinter das AlUpdatecheck:=true; und nicht hinter das dahinterliegende end;

BTW: So lang ist der Code ja nun auch wieder nicht. Da hatten wir schon längere ;-)

moritz 15. Jul 2003 20:31

Re: Nicht freigegebene Variabeln suchen
 
Hi

Das mit der freigabe habe ich umgestellt.

Christian Seehase 15. Jul 2003 20:34

Re: Nicht freigegebene Variabeln suchen
 
Moin Onz,

prima.

Wichtiger wäre wohl das Ab- und Einschalten des Timers. ;-)
Da Du ja grundsätzlich keine Objekte erzeugst, die Du nicht wieder freigibst dürfte die hohe Speicherauslastung daran liegen, dass das vor der Freigabe der Objekte noch einige neue angelegt wurden, die dann nicht mehr erreichbar sind.

moritz 15. Jul 2003 20:38

Re: Nicht freigegebene Variabeln suchen
 
Ok, werde das mit dem Timer einfach mal einbauen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:43 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz