AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Habe einen Speicherfresser, weis aber nicht wo :(
Thema durchsuchen
Ansicht
Themen-Optionen

Habe einen Speicherfresser, weis aber nicht wo :(

Ein Thema von Jackie1983 · begonnen am 6. Nov 2009 · letzter Beitrag vom 6. Nov 2009
Antwort Antwort
Jackie1983

Registriert seit: 12. Mär 2007
486 Beiträge
 
#1

Habe einen Speicherfresser, weis aber nicht wo :(

  Alt 6. Nov 2009, 15:42
Servus,

vielleicht könnt ihr mir ja weiterhelfen. Wenn ich mein Programm übernacht laufen lasse, wird die Speicherauslastung immer mehr. Irgend wann leidet auch das System darunter.

Die Anwendung ist eine Client / Server Anwendung. Es wird als Test Daten vom Client zum Server gesendet. Als erstes wird ein Ping gesendet wenn ein Pong vom Server kommt werden alle Daten gesendet.

Wenn die Anwendung offline ist, ist soweit alles ok, nur wenn der Client verbunden ist, wird speicher verschlungen.
Also denke ich das der "Fehler" im read vom Client ist.

Hier ein wenig code.

Senden daten vom Client zum Server
Delphi-Quellcode:
procedure TThreadClient.Send(var Cmd: TCommandHandling; FreeCmd: Boolean);
var
  ping : TCommandHandling;
begin
  fSendCS.Enter;
  try
    if cmd <> nil then
      fJobsBuffer := fJobsBuffer + cmd.SendFrames;
  finally
    fSendCS.Leave;
  end;

  //Jobs zum server senden
  if (fSocketClient.Active) and (cmd <> nil) then
  begin
    if fJobsBuffer <> 'then
    begin
      //Erst mit einem Ping testen ob Verbindung besteht.
      LogMessage('OUT Ping');
      Ping := TCommandHandling.Create(SYS_PING);
      try
        fSocketClient.Socket.SendBuf(PChar(ping.SendFrames)^,Length(ping.SendFrames));
      finally
        FreeAndNil(ping);
      end;
    end;
  end;

  //Freigeben
  if FreeCmd then
    FreeAndNil(cmd);
end;
Daten vom Server lesen
Delphi-Quellcode:
procedure TThreadClient.OnClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
  sBuffer,sJob : string;
  cmd,cmdRes : TCommandHandling;
  cmdSize : integer;
begin
  SetLength(sBuffer,Socket.ReceiveLength);
  Socket.ReceiveBuf(PChar(sBuffer)^,Length(sBuffer));

  FTempBuffer := FTempBuffer + sBuffer;
  SetLength(sBuffer, 0);

  while FTempBuffer <> 'do
  begin
    cmdSize := PCardinal(@FTempBuffer[1])^;
    if length(FTempBuffer) < cmdSize then break;

    sJob := copy(FTempBuffer,1,cmdSize);
    Delete(FTempBuffer,1,cmdSize);

    cmd := TCommandHandling.Create(CMDNone);
    cmd.SetFrames(sJob);
    case cmd.GetCmd of
      SYS_ALIVE : begin
        LogMessage('IN Alive');
        cmdRes := TCommandHandling.Create(SYS_ALIVE);
        try
          Socket.SendBuf(PChar(cmdRes.SendFrames)^,Length(cmdRes.SendFrames));
        finally
          FreeAndNil(cmdRes);
        end;
      end;
      SYS_PONG : begin
        fSendCS.Enter;
        try
          LogMessage('IN Pong');
          FPong := true;

          //Daten sende neu
          fSocketClient.Socket.SendBuf(PChar(fJobsBuffer)^,Length(fJobsBuffer));
          LogMessage('Job zum Server');
          LogMessage('OUT '+Dump(fJobsBuffer));
          fJobsBuffer := '';
          SetLength(fJobsBuffer, 0);
        finally
          fSendCS.Leave;
        end;
        //-----------------------------
      end;
    else if sJob <> 'then
      fJobCS.Enter;
      try
        fJobList.AddObject(sjob, socket);
      finally
        fJobCS.Leave;
      end;
      LogMessage('IN JOB: '+Dump(sJob));
    end; //case
    FreeAndNil(cmd);
  end; //while
end;
Ich bin der Meinung ich habe alles freigegeben.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Habe einen Speicherfresser, weis aber nicht wo :(

  Alt 6. Nov 2009, 15:46
Zunächst einmal solltest Du try-finally-Blöcke verwenden, um die Freigabe in jedem Fall zu gewährleisten. Und in neueren Delphi-Versionen kannst Du zum Testen ReportMemoryLeaksOnShutdown auf true setzen, so dass Dir Speicherlecks beim Beenden des Programms gemeldet werden.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Jackie1983

Registriert seit: 12. Mär 2007
486 Beiträge
 
#3

Re: Habe einen Speicherfresser, weis aber nicht wo :(

  Alt 6. Nov 2009, 15:51
So wie es aussieht, habe ich ReportMemoryLeaksOnShutdown noch nicht.
Aber die lecks werden auch mit FastMM4 angezeigt, mein Programm hat keine.
Sobal ich die Anwendung schließe ist alles ok, nur im Betrieb wird irgend wo was verschlungen.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Habe einen Speicherfresser, weis aber nicht wo :(

  Alt 6. Nov 2009, 15:54
Das kann ja eigentlich nur bedeuten, dass Du dynamisch irgendwelchen Speicher anforderst und erst spät wieder freigibst (fJobsBuffer würde ich z.B. einmal beobachten).
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Jackie1983

Registriert seit: 12. Mär 2007
486 Beiträge
 
#5

Re: Habe einen Speicherfresser, weis aber nicht wo :(

  Alt 6. Nov 2009, 15:58
habe schon mal einen großen Speicherfresser gefunden. LogMessage speichert alles in einen String. Das heist auch jeden Befehl der gesendet wird, ist klar das der String immer größer wird
Ich werde das Programm einfach nochmal über nacht laufen lassen und mal schauen was bei rumkommt.
  Mit Zitat antworten Zitat
Jackie1983

Registriert seit: 12. Mär 2007
486 Beiträge
 
#6

Re: Habe einen Speicherfresser, weis aber nicht wo :(

  Alt 6. Nov 2009, 16:37
Darf den allgemein der Speicher größer werden. Das heist wenn eine Anwendung eine Woche läuft das die Speicherauslastung größer wird ist ok....
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: Habe einen Speicherfresser, weis aber nicht wo :(

  Alt 6. Nov 2009, 16:40
ja, aber sollte sich asymptotisch dann doch einem Grenzwert nähern.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.004 Beiträge
 
Delphi 2009 Professional
 
#8

Re: Habe einen Speicherfresser, weis aber nicht wo :(

  Alt 6. Nov 2009, 18:20
Bei Daten vom Server lesen fehlt noch try .. finally für die mit cmd := TCommandHandling.Create(CMDNone); erzeugte Instanz

Viele Grüße,
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
Antwort Antwort


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 21:47 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