Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Die Delphi-IDE (https://www.delphipraxis.net/62-die-delphi-ide/)
-   -   Garbage Collector in Delphi 7 (https://www.delphipraxis.net/152585-garbage-collector-delphi-7-a.html)

christian_r 28. Jun 2010 11:52

Garbage Collector in Delphi 7
 
Delphi-Quellcode:
for i:= 1 to 5 do
begin
  AssignFile( f, 'PathToFile' + IntToStr( i ) );
  Reset( f );
end;
Im Code wird das Handle auf die Datei nicht geschlossen. f ist die einzige Referenz auf die jeweilige Datei. Produziere ich Overhead, oder gibt es alle Handles der vorhergehenden Schleifendurchläufe noch?

s.h.a.r.k 28. Jun 2010 11:55

AW: Garbage Collector in Delphi 7
 
Du musst das getrennt machen. Du überschreibst f ja immer. Nutze halt einfach ein Array.

himitsu 28. Jun 2010 12:12

AW: Garbage Collector in Delphi 7
 
Wenn du den Dateizugriff in einem Interface kapselst, dann hast du deinen GC.

Delphi-Quellcode:
AssignFile(f, ''); // oder TFileRec(f).Mode := fmClosed;
for i:= 1 to 5 do
begin
  if TFileRec(f).Mode <> fmClosed then CloseFile(f);
  AssignFile(f, 'PathToFile' + IntToStr(i));
  Reset(f);
  ...
end;
if TFileRec(f).Mode <> fmClosed then CloseFile(f);
Delphi-Quellcode:
AssignFile(f, ''); // oder TFileRec(f).Mode := fmClosed;
try
  for i:= 1 to 5 do
  begin
    if TFileRec(f).Mode <> fmClosed then CloseFile(f);
    AssignFile(f, 'PathToFile' + IntToStr(i));
    Reset(f);
    ...
  end;
finally
  if TFileRec(f).Mode <> fmClosed then CloseFile(f);
end;
aber besser doch so
Delphi-Quellcode:
for i:= 1 to 5 do
begin
  AssignFile(f, 'PathToFile' + IntToStr(i));
  Reset(f);
  try
    ...
  finally
    CloseFile(f);
  end;
end;

christian_r 28. Jun 2010 12:19

AW: Garbage Collector in Delphi 7
 
Ok. Anders gefragt. (himitsu's Beitrag inzwischen gelesen)
Muss ich die Handles zwingend mit CloseFile( ) schließen oder ist das egal, wenn ich f, also die Referenz, durch eine Neuzuweisung auflöse?

mkinzler 28. Jun 2010 12:24

AW: Garbage Collector in Delphi 7
 
Du solltest die Handle immer schliessen

christian_r 28. Jun 2010 12:28

AW: Garbage Collector in Delphi 7
 
Danke sehr.

Problem gelöst.

himitsu 28. Jun 2010 12:57

AW: Garbage Collector in Delphi 7
 
AssignFile prüft nicht, ob schon eine Datei mit dieser Variable geöffnet wurde.
Das ist auch nicht möglich, da der FileRecord nicht automatisch initialisiert wird.
AssignFile überschreibt also einfach den Record und das "alte" Dateihandle, aber es schließt diese Datei nicht.

Das Handle würde also, unter WinNT+ zumindestens, erst beim Beenden des Programms geschlossen, wenn du es nicht selber schließt.

p80286 28. Jun 2010 17:01

AW: Garbage Collector in Delphi 7
 
Es gibt noch ein kleines Problem,
ohne fileClose werden die internen Puffer nicht gelehrt, es kann also sein, das nicht alle Daten in der Datei landen, wenn man schreibt.
(über Stil-Fragen wird hier ja nicht diskutiert?)

Gruß
K-H


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:27 Uhr.

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