Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi lokale variable in finalization? (https://www.delphipraxis.net/73613-lokale-variable-finalization.html)

DGL-luke 20. Jul 2006 15:07


lokale variable in finalization?
 
hallo,

in einer unit mit threads nutze ich unit-globale critical sections für den dateizugriff. die werden bei finalization freigegeben:

Delphi-Quellcode:
initialization
  CriticalSections := TStringList.Create;
  SectionsAccess  := TCriticalSection.Create;
finalization
  for i := 0 to CriticalSections.Count - 1 do
    begin
      CriticalSections.Objects[i].Free;
    end;
  CriticalSections.Free;
  SectionsAccess.Free;
en
"i" habe ich auch global deklariert, und delphi meckert:
Zitat:

[Pascal Warnung] ULogThreads.pas(178): W1019 FOR-Schleifenvariable muss eine einfache lokale Variable sein
wie macht man das "elegant"?

Muetze1 20. Jul 2006 15:21

Re: lokale variable in finalization?
 
1. Leg dir eine Procudure dafür an, die du einfach aufrufst - die Procedure kann dann eine lokale Variable haben.
2. Warum TStringList? Sicher dass du keine TObjectList nutzen willst?

himitsu 20. Jul 2006 15:25

Re: lokale variable in finalization?
 
oder (ist zwar langsamer), aber wenn es gewünscht wird....

Delphi-Quellcode:
initialization
  SectionsAccess  := TCriticalSection.Create;
  CriticalSections := TStringList.Create;
finalization
  while CriticalSections.Count > 0 do
    begin
      CriticalSections.Objects[0].Free;
      CriticalSections.Delete(0);
      // ich hoffe das Delete stimmt, aber wenn nicht ...
      // es sollte klar sein, was gemeint ist ._.
    end;
  CriticalSections.Free;
  SectionsAccess.Free;
end.

DGL-luke 20. Jul 2006 15:37

Re: lokale variable in finalization?
 
Also elegant sieht das nicht aus, himitsu...

@Muetze1: Naja, sind critical sections für dateischreibaktionen. Alle Dateien, in denen ich schon mal was gemacht hab, stehen in der stringlist, und im object die dazugehörige TCriticalSection. Also if Index(filename) = -1 neuen eintrag anlegen, ansonsten den verwenden, der zurückkommt.

Ich werd das mit der procedure wohl machen, sobald ich dazu komme.

Gibt es irgendwelche echten Gegenindikationen gegen die benutzung der globalen Variablen i(also was, wos irgendwann knallt)? ich nehm sie ja sonst nirgends her.

Muetze1 20. Jul 2006 16:06

Re: lokale variable in finalization?
 
Zitat:

Zitat von himitsu
oder (ist zwar langsamer), aber wenn es gewünscht wird....

Viel zu langsam. Du lässt ihn mit jedem Dateinamen noch extra wieder die Liste verschieben. Dann lieber so:

Delphi-Quellcode:
initialization
  SectionsAccess  := TCriticalSection.Create;
  CriticalSections := TStringList.Create;
finalization
  while CriticalSections.Count > 0 do
    begin
      CriticalSections.Objects[Pred(CriticalSections.Count)].Free;
      CriticalSections.Delete(Pred(CriticalSections.Count));
    end;
  CriticalSections.Free;
  SectionsAccess.Free;
end.
[/quote]

himitsu 20. Jul 2006 16:12

Re: lokale variable in finalization?
 
och, dann doch lieber wieder mit der Schleife und ohne zwischendurch zu löschen ... es gibt nicht nur For-Schleifchen ... und du willst nicht wissen, was man noch als lokale Variable misbrauchen kann :roll:


[add]
zum thema:
CriticalSections machst du doch per SectionsAccess threadsicher?
dann sollte es wohl keine Probleme geben (die beiden variablen hast du ja bestimmt in implementation deklariert, also nur Unit-global?

DGL-luke 20. Jul 2006 16:22

Re: lokale variable in finalization?
 
Zitat:

Zitat von himitsu
CriticalSections machst du doch per SectionsAccess threadsicher?

Ja. *stolz ist* ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:39 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