Einzelnen Beitrag anzeigen

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