Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Globale Variable für IntraWeb (https://www.delphipraxis.net/5706-globale-variable-fuer-intraweb.html)

WEBSTER 16. Jun 2003 13:30


Globale Variable für IntraWeb
 
Salute,

wie und wo definiere ich eine Globale Variable und wie greife ich auf diese zu...?

Ich benötige so etwas wie einen Zähler, um zu ermitteln wieviel user Online sind...

THX
WEBSTER

darkstone 16. Jun 2003 14: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.

Christian Seehase 16. Jun 2003 14:08

Moin Darkstone,

warum nicht so:

Delphi-Quellcode:
begin
  fSync.Enter;
  try
    Inc(fCounter);
  finally
    fSync.Leave;
  end;
end;
?

Sonst macht try/finally keinen Sinn.

darkstone 16. Jun 2003 14:13

hast natürlich vollkommen recht - hab mich vertippt. Das try/finally war auch nur als Beispiel gedacht, bei "Inc(fCounter)" wird wohl kaum eine Exception auftreten und ist hier sicher Luxus...

WEBSTER 16. Jun 2003 14:44

Salute,

danke für Eure super Tipps.....

WEBSTER

Christian Seehase 16. Jun 2003 14:52

Moin Darkstone,

Zitat:

Zitat von Darkstone
bei "Inc(fCounter)" wird wohl kaum eine Exception auftreten

Wenn Du die Bereichsüberprüfung für Integer Operationen aktiv hast ist es zumindest nicht ausgeschlossen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:31 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz