문제

이 코드 블록을 여러 클라이언트 스레드에서 반복적으로 실행할 때 '너무 많은 파일'메시지가 포함 된 einouterror를 얻습니다.

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

클라이언트 스레드 수는 약 10이므로 언제든지 10 개의 파일 만 열 수 있습니다. 델파이가 파일을 즉시 닫기를 거부 할 가능성이 있습니까? 그렇게 할 수 있습니까? 아니면 여기서 실수를하고 있습니까? 이곳은 내가 파일을 열고 시도하는 유일한 곳입니다. - 핀 블록은 열린 파일이 닫히도록 보장해야합니까?

Reedit : 편집을 잊어 버리십시오

도움이 되었습니까?

해결책

파일을 다루기 위해 더 "현대적인"시설을 사용하는 것이 좋습니다. Windows API를 사용하여 열린 파일 제한이 있는지 여부는 모르겠지만 방금 테스트했으며 병렬로 1000 개의 스트림을 쉽게 열 수 있습니다.

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;

사람들이 왜 여전히 유형이없는 파일을 사용하는지 이해하지 못했습니다. TSTREAM 그리고 새로운 코드의 후손.

편집하다: 귀하의 의견에 귀하는 일반 텍스트 파일 만 읽고 싶다고 씁니다. tstringlist 그리고 그것의 사용 loadfromfile () 방법.

다른 팁

오래된 Windows 9X 기반 컴퓨터에서 이것을 실행하지 않습니까? 그렇다면 DOS 파일 핸들 문제가 발생할 수 있습니다.

Delphi는 CloseFile에서 면도 적으로 닫힙니다. 예제 코드가 올바른 것 같습니다.

시도와 마지막으로 아무것도없이 다시 시도하십시오.

거기 이다 문제를 일으킬 수있는 방법을 알 수는 없지만 스레드 안전 문제.

문제는 재설정이 Global FileMode 변수를 사용하는 것입니다.

클라이언트 스레드의 경우-당신은 그들이 깨진 연결이나 무언가에서 누출되지 않습니까?

리셋과 닫기와 함께 디버그 출력을 넣는 것이 유용하여 각 스레드에 파일이 얼마나 오래 열리는 지 확인할 수 있습니다.

정말 스레드가 필요합니까? 그들이 당신에게 문제를 일으키는 것처럼 들립니다. 코드가 없으면 디버깅하기가 더 쉬울 것입니다.

이 코드는 잘 작동해야합니다. 스레드 코드에서 파일을 사용하는 것과 관련된 알려진 문제는 없습니다 (내가 아는 한). 우리는 그러한 관용구를 상당히 규칙적으로 사용하고 모든 것이 잘 작동합니다.

a) 닫기가 실행되고 b) 실제로 10 개의 스레드 만 실행되는지 확인하기 위해 일부 로깅 코드 (할당 및 클로시 파일 전)를 추가하는 것이 좋습니다. 스레드 종단 로직이 결함이 있고 근접 파일이 실행되지 않을 수도 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top