Pergunta

Eu recebo um EInOutError com a mensagem 'Muitos arquivos abertos' ao executar este bloco de código repetidamente durante algum tempo a partir de um número de segmentos de clientes:

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

O número de segmentos de clientes é de aproximadamente 10, portanto, apenas 10 arquivos podem ser abertos a qualquer momento. Existe alguma possibilidade de que Delphi se recusa a fechar arquivos imediatamente? Posso garantir que ele faz? Ou eu estou cometendo um erro aqui? Este é o único lugar onde eu abrir arquivos e o bloco try..finally deve garantir que os arquivos abertos ficar fechado, não deve ele?

reeditar: esquecer a editar

Foi útil?

Solução

Eu só posso aconselhá-lo a usar os mais facilidades "modernos" para lidar com arquivos. Eu não sei se existe um limite de arquivos abertos usando a API do Windows, mas eu apenas testado e poderia facilmente abertas 1000 streams em paralelo:

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;

Nunca entendi por que as pessoas ainda usam arquivos sem tipo em vez de TStream e seus descendentes no novo código.

Editar: em seu comentário que você escrever que você só quer ler arquivos de texto puro - se assim apenas criar um TStringList e usar sua LoadFromFile () método.

Outras dicas

Você não está executando isso em um computador com Windows 9x mais velho, não é? Se assim for, você pode estar correndo em um problema filehandle DOS.

Delphi fecha immidiately na CloseFile. Seu código exemplo parece ser correto.

Tente novamente sem nada entre try e, finalmente.

Não é uma questão de segurança tópico aqui, embora eu não posso ver como ele poderia causar o problema.

O problema é usos redefinir a variável FileMode global.

Como para threads de cliente - você tem certeza que eles não estão vazando afastado em conexões quebradas ou algo

?

Pode ser útil para colocar alguns saída de depuração juntamente com o Reset e o próximo para que você pode ver quanto tempo cada thread tem a abertura de arquivo para.

Você realmente precisa de tópicos? Parece que eles estão lhe causando problemas. Seu código seria mais fácil de depurar sem eles.

Este código deve funcionar muito bem. Não há problemas conhecidos relacionados ao uso de arquivos de código da thread (tanto quanto eu sei). Nós usamos essas expressões idiomáticas com bastante regularidade e tudo funciona bem.

Gostaria de sugerir a adição de algum código de registro (antes Atribuir e CloseFile) para ver se a) próximo é executado e b) você realmente tem apenas 10 threads em execução. Talvez a sua lógica segmento de terminação está com defeito e CloseFile nunca executa.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top