![]() |
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? |
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: |
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 |
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 |
Re: Nicht freigegebene Variabeln suchen
Moin Onz,
Du kannst hier auch Attachements anhängen, der Code müsste also nicht direkt in's Posting. |
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:
Sollte alles gewesen sein.
{###########################################################}
{###########################################################} 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; {###########################################################} {###########################################################} |
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 ;-) |
Re: Nicht freigegebene Variabeln suchen
Hi
Das mit der freigabe habe ich umgestellt. |
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. |
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. |
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