سؤال

وأحصل على EInOutError مع رسالة "عدد كبير جدا من الملفات المفتوحة" عند تنفيذ هذه الكتلة كود مرارا وتكرارا لبعض الوقت من عدد من المواضيع العميل:

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

وعدد من المواضيع عميل ما يقرب من 10، وذلك ملفات 10 فقط يمكن أن تكون مفتوحة في أي وقت. هل هناك أي احتمال أن دلفي ترفض إغلاق الملفات على الفور؟ يمكنني التأكد من أن يفعل؟ أو أنا يرتكب خطأ هنا؟ هذا هو المكان الوحيد الذي يمكنني فتح الملفات وكتلة try..finally يجب أن يضمن أن فتح ملفات الحصول على مغلقة، لا ينبغي ذلك؟

وREEDIT: ننسى تحرير

هل كانت مفيدة؟

المحلول

ويمكن أن أنصح لكم فقط لاستخدام المزيد من التسهيلات "العصرية" للتعامل مع الملفات. أنا لا أعرف ما إذا كان هناك حد من الملفات المفتوحة باستخدام 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، وأنت؟ إذا كان الأمر كذلك، قد تكون قيد التشغيل في مشكلة filehandle DOS.

يغلق

ودلفي إيميدياتيلي في CloseFile. مثال التعليمة البرمجية الخاصة بك ويبدو أن يكون صحيحا.

وحاول مرة أخرى من دون أي شيء بين محاولة وأخيرا.

وهناك هو مسألة السلامة موضوع هنا على الرغم من أنني لا يمكن أن نرى كيف يمكن أن تتسبب في حدوث المشكلة.

والمشكلة هي إعادة يستخدم متغير FileMode العالمي.

وأما عن المواضيع العميل - هل أنت متأكد من أنها لا تسرب بعيدا عن وصلات مكسورة أو شيء

قد يكون من المفيد وضع بعض إخراج التصحيح إلى جانب إعادة تعيين وإغلاق حتى تتمكن من معرفة كم من الوقت كل موضوع لديه ملف مفتوح لل.

هل كنت حقا بحاجة المواضيع؟ هذا يبدو وكأنه أنها تسبب لك المشاكل. أن التعليمات البرمجية يكون من الأسهل لتصحيح بدونها.

وهذا الرمز يجب أن تعمل على ما يرام. لا توجد مشاكل المعروفة المتعلقة باستخدام ملفات من التعليمات البرمجية الخيوط (بقدر ما أعرف). نحن نستخدم هذه التعابير بشكل منتظم وكل شيء يعمل بشكل جيد.

وأود أن أقترح إضافة بعض التعليمات البرمجية تسجيل (قبل تعيين وCloseFile) لمعرفة ما إذا كان يتم تنفيذ) وثيقة وب) لديك حقا سوى 10 المواضيع قيد التشغيل. ربما منطق موضوع إنهاء الخاص بك هو خلل وCloseFile ينفذ أبدا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top