Domanda

Ricevo un EInOutError con il messaggio 'Troppi file aperti' quando eseguo questo blocco di codice ripetutamente per qualche tempo da un numero di thread client:

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

Il numero di thread client è circa 10, quindi è possibile aprire solo 10 file in qualsiasi momento. C'è qualche possibilità che Delphi si rifiuti di chiudere subito i file? Posso assicurarmi che lo faccia? O sto facendo un errore qui? Questo è l'unico posto dove apro i file e il blocco try..finally dovrebbe garantire che i file aperti vengano chiusi, non è vero?

REEDIT: dimentica la modifica

È stato utile?

Soluzione

Posso solo consigliarti di utilizzare il più "moderno" strutture per la gestione dei file. Non so se esiste un limite di file aperti utilizzando l'API di Windows, ma ho appena testato e potrei facilmente aprire 1000 flussi in parallelo:

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;

Non ho mai capito perché le persone usano ancora file non tipizzati invece di TStream e dei suoi discendenti nel nuovo codice.

Modifica: nel tuo commento scrivi che vuoi solo leggere file di testo in chiaro - in tal caso basta creare un TStringList e usare LoadFromFile () metodo.

Altri suggerimenti

Non lo stai eseguendo su un vecchio computer basato su Windows 9x, vero? In tal caso, potresti riscontrare un problema con il filehandle DOS.

Delphi si chiude immidiatamente nel CloseFile. Il tuo codice di esempio sembra essere corretto.

Riprova senza fare nulla tra provare e infine.

Esiste È un problema di sicurezza del thread qui, anche se non riesco a vedere come potrebbe causare il problema.

Il problema è che Reset utilizza la variabile FileMode globale.

Per quanto riguarda i thread client, sei sicuro che non perdano su connessioni interrotte o qualcosa del genere?

Potrebbe essere utile mettere un po 'di output di debug insieme a Reset e Close in modo da poter vedere per quanto tempo ogni thread ha aperto il file.

Hai davvero bisogno di discussioni? Sembra che ti stiano causando problemi. Il tuo codice sarebbe più facile da eseguire il debug senza di essi.

Questo codice dovrebbe funzionare bene. Non ci sono problemi noti relativi all'utilizzo di file dal codice thread (per quanto ne so). Usiamo questi idiomi abbastanza regolarmente e tutto funziona bene.

Suggerirei di aggiungere un po 'di codice di registrazione (prima di Assign e CloseFile) per vedere se a) viene eseguita la chiusura eb) hai davvero solo 10 thread in esecuzione. Forse la logica di terminazione del thread è difettosa e CloseFile non viene mai eseguito.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top