Einzelnen Beitrag anzeigen

Benutzerbild von HeikoAdams
HeikoAdams

Registriert seit: 12. Jul 2004
Ort: Oberfranken
661 Beiträge
 
FreePascal / Lazarus
 
#1

Speicherleck in TIdSNTP??

  Alt 25. Aug 2008, 14:50
Hallo,
laut FastMM bleiben nach dem Aufruf der folgenden Prozedur 1 TIdThreadSaveInteger und 2 TIdCriticalSection im Speicher übrig:
Delphi-Quellcode:
procedure LoginSpeichern(DataSet: TAdoDataSet; UserId: Integer; Pause: Double;
  PauseVon, PauseBis: TTime; const SyncSysTime: Boolean = False);
var
  Day, Month, Year: Word;
  TimeServer: TIdSNTP;
  Jetzt: TDateTime;
  ServerID: Integer;
  Fehler: Boolean;
begin
  Jetzt := Now;
  Fehler := False;

  Randomize();
  ServerID := Random(High(ServerPool) - 1);

  TimeServer := TIdSNTP.Create(nil);
  with TimeServer do
  begin
    ReceiveTimeout := 1000;
    try
      try
        Host := ServerPool[ServerID];
        Connect;
        //repeat until Connected;
        Jetzt := DateTime;
        if SyncSysTime then
          try
            if not SyncTime then
              MessageBox(0, AtomicTime02, MsgError, MB_ICONWARNING or MB_OK or
                MB_APPLMODAL);
          except
              MessageBox(0, AtomicTime03, MsgError, MB_ICONWARNING or MB_OK or
                MB_APPLMODAL);
          end;
      except
        Fehler := True;
      end;
    finally
      //Disconnect;
      //Free;
      Destroy;
    end;
  end;

  if Fehler then
  begin
    Jetzt := Now;
    MessageBox(0, AtomicTime01, MsgError, MB_ICONWARNING or MB_OK or
      MB_APPLMODAL);
  end;

  Year := 0;
  Month := 0;
  Day := 0;
  DecodeDate(Jetzt, Year, Month, Day);

  with DataSet do
  begin
    Close;
    with Parameters do
    begin
      ParamValues['pUser'] := UserID;
      ParamValues['pTag'] := Day;
      ParamValues['pMon'] := Month;
      ParamValues['pJahr'] := Year;
    end;
    Open;

    if (RecordCount = 0) then
    begin
      Append;
      FieldByName('Benutzer').AsInteger := UserID;
      FieldByName('Login').AsDateTime := Jetzt;
      FieldByName('Tag').AsInteger := Day;
      FieldByName('Monat').AsInteger := Month;
      FieldByName('Jahr').AsInteger := Year;
    end
    else
    begin
      First;
      Edit;
      if (FieldByName('Login').AsVariant <> NULL) then
      begin
        FieldByName('Zeit').AsFloat := CalcArbeitszeit(FieldByName('Login').AsDateTime,
          Jetzt, PauseVon, PauseBis, Pause);
      end;
      FieldByName('Logout').AsVariant := null;
    end;
    Post;
    Close;
  end;
end;
Ist das tatsächlich ein Speicherleck oder mache ich "nur" irgendwas falsch??
Jeder kann ein Held werden und Leben retten!
Einfach beim NKR oder der DKMS als Stammzellenspender registrieren! Also: worauf wartest Du noch?
  Mit Zitat antworten Zitat