문제
이 코드 블록을 여러 클라이언트 스레드에서 반복적으로 실행할 때 '너무 많은 파일'메시지가 포함 된 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 개의 스레드 만 실행되는지 확인하기 위해 일부 로깅 코드 (할당 및 클로시 파일 전)를 추가하는 것이 좋습니다. 스레드 종단 로직이 결함이 있고 근접 파일이 실행되지 않을 수도 있습니다.