AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Garbage Collector in Delphi 7

Ein Thema von christian_r · begonnen am 28. Jun 2010 · letzter Beitrag vom 28. Jun 2010
Antwort Antwort
christian_r
(Gast)

n/a Beiträge
 
#1

Garbage Collector in Delphi 7

  Alt 28. Jun 2010, 12:52
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?
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#2

AW: Garbage Collector in Delphi 7

  Alt 28. Jun 2010, 12:55
Du musst das getrennt machen. Du überschreibst f ja immer. Nutze halt einfach ein Array.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#3

AW: Garbage Collector in Delphi 7

  Alt 28. Jun 2010, 13:12
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;
$2B or not $2B
  Mit Zitat antworten Zitat
christian_r
(Gast)

n/a Beiträge
 
#4

AW: Garbage Collector in Delphi 7

  Alt 28. Jun 2010, 13:19
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?
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Garbage Collector in Delphi 7

  Alt 28. Jun 2010, 13:24
Du solltest die Handle immer schliessen
Markus Kinzler
  Mit Zitat antworten Zitat
christian_r
(Gast)

n/a Beiträge
 
#6

AW: Garbage Collector in Delphi 7

  Alt 28. Jun 2010, 13:28
Danke sehr.

Problem gelöst.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#7

AW: Garbage Collector in Delphi 7

  Alt 28. Jun 2010, 13:57
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.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#8

AW: Garbage Collector in Delphi 7

  Alt 28. Jun 2010, 18:01
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:07 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