Einzelnen Beitrag anzeigen

darkstone

Registriert seit: 4. Feb 2003
26 Beiträge
 
#2
  Alt 16. Jun 2003, 15:02
Hi!

Also grundsätzlich sind globale Zähler (vor allem in einer Multi-threaded Anwendung) eine grosse Gefahr, falsche Ergebnisse zu liefern. Wenn du wirklich globale Variablen brauchst, würde ich die in einer Klasse definieren und die Methoden Thread-Safe programmieren. Bsp:

Delphi-Quellcode:
TGlobalCounter = class
  protected
    fCounter: Integer;
    fSync: TCriticalSection;
  public
    constructor Create;
    destructor Destroy;

    function Get_Counter: Integer;
    procedure Set_Counter;
end;

constructor TGlobalCounter.Create;
begin
  fSync := TCriticalSection.Create;
end;

destructor TGlobalCounter.Destroy;
begin
  if fSync <> nil then
    fSync.Destroy;
end;

function TGlobalCounter.Get_Counter: Integer;
begin
  // die Read-Operation kann ganz normal durchgeführt werden.
  Result := fCounter;
end;

procedure TGlobalCounter.Set_Counter;
begin
  // Beim Write muss "serialisiert" werden.
  fSync.Enter;
    Inc(fCounter);
  try
    fSync.Leave;
  finally
  end;
end;
Dieser Code is aus dem Stegreif - keine Garantie.
Mehr zu TCriticalSection in der Hilfe.
Die Klasse kann global instanziiert werden und dann vielleicht im Application-Object (.Tag) hinterlegt werden - sofern bei Intraweb Application auch wirklich global ist.
  Mit Zitat antworten Zitat