Frage

Ich erhalte eine EInOutError mit der Meldung ‚Zu viele offene Dateien‘, wenn sie von einer Reihe von Client-Threads diesen Codeblock wiederholt für einige Zeit ausführen:

var InputFile : Text;
...
Assign (InputFile, FileName);
Reset (InputFile)
try
  // do some stuff
finally
  CloseFile (InputFile);
end;

Die Anzahl der Client-Threads ist etwa 10, so dass nur 10 Dateien jederzeit geöffnet werden können. Gibt es eine Möglichkeit, dass Delphi-Dateien schließen sofort verweigert? Kann ich sicher, dass es funktioniert? Oder mache ich hier einen Fehler? Dies ist der einzige Ort, wo ich Dateien öffnen und der try..finally Block sollte gewährleisten, dass Dateien geöffnet bekommen geschlossen, sollte es nicht?

reedit: vergessen Sie das Bearbeiten

War es hilfreich?

Lösung

Ich kann Ihnen nur raten, die „modernen“ Einrichtungen zu verwenden, um mit Dateien zu tun. Ich weiß nicht, ob es eine Grenze von geöffneten Dateien ist der Windows-API, aber ich nur getestet und konnte leicht öffnen 1000 Ströme parallel:

procedure TForm1.Button1Click(Sender: TObject);
var
  Strs: TList;
  i: integer;
begin
  Strs := TList.Create;
  try
    for i := 1 to 1000 do begin
      Strs.Add(TFileStream.Create('D:\foo.txt', fmOpenRead or fmShareDenyWrite));
    end;
  finally
    FreeObjectList(Strs);
  end;
end;

Ich habe nie verstanden, warum noch immer Menschen nicht typisierte Dateien anstelle von TStream und seine Nachkommen in neuen Code ein.

Edit: In Ihrem Kommentar schreiben Sie, dass Sie nur einfache Textdateien lesen wollen - wenn ja nur eine erstellen TStringList und verwenden seine Loadfromfile () Methode.

Andere Tipps

Sie führen dies nicht auf einem älteren Windows 9x Computern, sind Sie? Wenn ja, könnten Sie in einem DOS-Dateihandle Problem ausgeführt werden.

Delphi schließt immidiately in der Closefile. Ihr Beispiel-Code scheint korrekt zu sein.

Versuchen Sie es erneut, ohne irgendetwas zwischen Versuch und schließlich.

Es IST ein Thread Sicherheitsproblem hier, obwohl ich nicht sehen kann, wie sie das Problem verursachen könnten.

Das Problem ist, Reset, um die globale Filemode Variable verwendet.

Wie für Client-Threads - sind Sie sicher, dass sie auf unterbrochene Verbindungen oder etwas nicht undicht sind weg

?

könnte nützlich sein, einig Debug-Ausgabe neben der Reset zu setzen und das Schließen, so dass Sie sehen können, wie lange jeder Thread die Datei für geöffnet hat.

Sie benötigen wirklich Fäden? Es klingt wie sie Probleme verursachen. Ihr Code wäre einfacher, ohne sie zu debuggen.

Dieser Code sollte gut funktionieren. Es gibt keine bekannten Probleme mit Dateien von Gewinden Code verwendet (soweit ich weiß). Wir nutzen diese Idiome ziemlich regelmäßig und alles funktioniert.

Ich würde vorschlagen, einige Protokollierung Code hinzufügen (vor zuordnen und Closefile) zu sehen, ob eine) in der Nähe ausgeführt wird, und b) Sie haben wirklich nur 10 Threads ausgeführt wird. Vielleicht Logik der Thread endet, ist fehlerhaft und führt nie Closefile.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top