Einzelnen Beitrag anzeigen

RedShakal
(Gast)

n/a Beiträge
 
#6

Re: Connection Closed Gracefully.

  Alt 21. Dez 2009, 11:56
Zitat von Astat:
Zitat von RedShakal:
Das Problem ist doch noch nicht so gelöst wie ich dachte.
1. Das Problem mit dem Datumsseparator:
DateSeparator := '.'; 2. Das Problem mit dem mehrfachen Aufruf:
procedure TServer.IdTCPServer1Execute(AThread: TIdContext); Ist ein Serverthread, dieser wird auch mehrfach aufgerufen werden können.

Dh. Die Log-Schreiberei und Globalen Variablen müssen Threadsave sein, sonst knallts sowiso irgendwann.

Tip: Das Logging in eine Threadsave Funktion auslagern, und mit CriticalSections synchronisieren.

Delphi-Quellcode:
var
  _SyncLog: TRTLCriticalSection;

procedure LogWrite(const ALogfile, AMessage: string);
var
  f: TextFile;
begin
  EnterCriticalSection(_SyncLog);
  try
    AssignFile(f, ALogfile);
    try
      {$I-}
      if FileExists(ALogfile) then Append(f) else Rewrite(f);
      if IOResult <> 0 then Reset(f);
      {$I+}
      Writeln(f, AMessage);
    finally
      CloseFile(f);
    end;
  finally
    LeaveCriticalSection(_SyncLog);
  end;
end;

initialization
  InitializeCriticalSection(_SyncLog);
finalization
  DeleteCriticalSection(_SyncLog);
end.
lg. Astat

Ehrlich gesagt ist mir der Code etwas zu kompliziert. Schon mein Lehrer hat damals immer gesagt kopiere nie was du nicht verstehst




__________________________________________________ __________


Zitat von alzaimar:
Zitat von Astat:
1. Das Problem mit dem Datumsseparator:
DateSeparator := '.';
Meinst Du nicht, man schießt mit Kanonen auf Spatzen und handelt sich u.U. unangenehme Seiteneffekte ein?
Eine einfache Funktion, die einen Dateinamen für Logdateien erstellt, ist doch ausreichend:
Delphi-Quellcode:
Function GetLogFilename() : String;
Var
  y,m,d : Word;

Begin
  DecodeDate(Now,y,m,d);
  Result := Format('log\%.2d-%.2d-%.2d.TXT',[y,m,d]);
End;
Das klappt so leider auch nicht so ganz. Der IO Fehler besteht trozdem.
Es scheint so als würde er die Datei nicht richtig schließen, weil ich sie solang der Server läuft auch nicht im Windows öffnen kann.
Deshalb habe ich jetzt mal Testweise unter jedes WriteLn ein Closefile geschrieben. Leider ohne erfolg.
  Mit Zitat antworten Zitat