Einzelnen Beitrag anzeigen

Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#3

Re: Zugriff auf globales Object in CriticalSection?

  Alt 24. Sep 2008, 16:44
Ist es eine globale-globale ( ) Variable oder eine variable, die nur in der Implementation einer Unit steckt?
Wenn letzteres, ann könntest du ja eine Funktion zur Verfügung stellen, die lesenden Zugriff auf das Log gewährt.

Den globale variablen, die jeder lesen und schreiben kann sind ziemlicher Mist, denn die kannst du gar nicht absichern.

Grob vereinfacht, wäre sowas hier möglich:
Delphi-Quellcode:
type
  TLog = class
  ...
  public
    procedure Log(...); virtual; abstract;
    class function GetLog : TLog;
    class procedure RegisterLogHandler(logHandler : TLog);
  end;

implementation
var
  globalLogInstance : TLog

type
  TAggregatedLog = class(TLog)
  ...
  public
    property LogHandlers : TObjectList...;
    procedure Log(...); override;
    ...
  end;

...

class procedure TAggregatedLog.RegisterLogHandler(logHandler : TLog);
begin
  EnterCriticalSection(lpLogCS);
  try
    LogHandlers[i].Add(logHandler);
  finally
    LeaveCriticalSection(lpLogCS);
  end;
end;

procedure TAggregatedLog.Log(...) : TLog;
var
  i : Integer;
begin
  EnterCriticalSection(lpLogCS);
  try
    for i := 0 LogHandlers.Count - 1 do
      Tlog(LogHandlers[i]).Log(...);
  finally
    LeaveCriticalSection(lpLogCS);
  end;
end;

class function GetLog : TLog;
begin
  result := globalLogInstance;
end;

initialization
  globalLogInstance := TAggregatedLog.Create();
finalization
  globalLogInstance.Free();
end.
einmal so verpackt, könntest du beliebige Logger zur laufzeit registrieren.
Und die Instanz in der Unit würde mit allen einen Log-Eintrag generieren, ohne dass der zu benutzende Code etwas davn wissen muss. (Zum Bleistift Eventlog, Dateilog, Kommandozeile, email, ...)

Da du jetzt keine öffentlich beschreibare globale Variable nutzt, könntest du dann in der Methode zum Registrieren die gleiche CriticalSection nutzen. Einfach um sicher zu stellen, dass nix halbes ausgeführt wird.

Aber wozu der Stress, ich dachte es gibt bereits ein LogForDelphi?
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat