AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Nicht freigegebene Variabeln suchen

Ein Thema von moritz · begonnen am 15. Jul 2003 · letzter Beitrag vom 15. Jul 2003
Antwort Antwort
Seite 1 von 2  1 2      
moritz

Registriert seit: 18. Apr 2003
1.037 Beiträge
 
#1

Nicht freigegebene Variabeln suchen

  Alt 15. Jul 2003, 18:00
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?
"Optimistisch ist diejenige Weltanschauung, die das Sein höher als das Nichts stellt und so die Welt und das Leben als etwas an sich Wertvolles bejaht."
Albert Schweitzer
  Mit Zitat antworten Zitat
Benutzerbild von Stanlay Hanks
Stanlay Hanks

Registriert seit: 1. Mär 2003
2.078 Beiträge
 
Delphi 2005 Professional
 
#2

Re: Nicht freigegebene Variabeln suchen

  Alt 15. Jul 2003, 18:51
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
  Mit Zitat antworten Zitat
Alexander

Registriert seit: 28. Aug 2002
Ort: Oldenburg
3.513 Beiträge
 
Turbo Delphi für .NET
 
#3

Re: Nicht freigegebene Variabeln suchen

  Alt 15. Jul 2003, 18:58
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
Alexander
  Mit Zitat antworten Zitat
moritz

Registriert seit: 18. Apr 2003
1.037 Beiträge
 
#4

Re: Nicht freigegebene Variabeln suchen

  Alt 15. Jul 2003, 18:58
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
"Optimistisch ist diejenige Weltanschauung, die das Sein höher als das Nichts stellt und so die Welt und das Leben als etwas an sich Wertvolles bejaht."
Albert Schweitzer
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: Nicht freigegebene Variabeln suchen

  Alt 15. Jul 2003, 19:00
Moin Onz,

Du kannst hier auch Attachements anhängen, der Code müsste also nicht direkt in's Posting.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
moritz

Registriert seit: 18. Apr 2003
1.037 Beiträge
 
#6

Re: Nicht freigegebene Variabeln suchen

  Alt 15. Jul 2003, 19:05
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.
"Optimistisch ist diejenige Weltanschauung, die das Sein höher als das Nichts stellt und so die Welt und das Leben als etwas an sich Wertvolles bejaht."
Albert Schweitzer
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: Nicht freigegebene Variabeln suchen

  Alt 15. Jul 2003, 19:24
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
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
moritz

Registriert seit: 18. Apr 2003
1.037 Beiträge
 
#8

Re: Nicht freigegebene Variabeln suchen

  Alt 15. Jul 2003, 19:31
Hi

Das mit der freigabe habe ich umgestellt.
"Optimistisch ist diejenige Weltanschauung, die das Sein höher als das Nichts stellt und so die Welt und das Leben als etwas an sich Wertvolles bejaht."
Albert Schweitzer
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#9

Re: Nicht freigegebene Variabeln suchen

  Alt 15. Jul 2003, 19:34
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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
moritz

Registriert seit: 18. Apr 2003
1.037 Beiträge
 
#10

Re: Nicht freigegebene Variabeln suchen

  Alt 15. Jul 2003, 19:38
Ok, werde das mit dem Timer einfach mal einbauen.
"Optimistisch ist diejenige Weltanschauung, die das Sein höher als das Nichts stellt und so die Welt und das Leben als etwas an sich Wertvolles bejaht."
Albert Schweitzer
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:16 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz