سؤال

لدي بعض الذكريات تسرب ذات الصلة TITHTTP عندما تنتظر استجابة خادم بعد الحصول وأنه يتم إنهاء الخيط.

مثال :

aThread = class(TThread) 
private  
  FidHTTP :TidHTTP;   
  FCommand :String;
public   
  procedure Execute(); override;   
  constructor Create(aCommand :String); override;
  procedure Disconnect;
end;

procedure aThread.Execute();   
  var response :String; 
begin   
  response := FidHTTP.Get(FCommand); 
end;

procedure aThread.Disconnect;
begin
  if ((FidHTTP <> nil) and (FidHTTP.Connected)) then FidHTTP.IOHandler.CloseGracefully;
end;

constructor aThread.Create(aCommand :String); override; 
begin   
  FCommand := aCommand;    
  inherited Create; 
end;

أوقف الخيط مع هذا عند إغلاق التطبيق:

aThread.Disconnect;
aThread.Terminate;
aThread.Free;

ماذا علي أن أفعل لحل تسرب الذكريات؟

FastMM4 Log :

13 - 20 bytes: TIdThreadSafeInteger x 1
21 - 36 bytes: EAccessViolation x 1, TIdCriticalSection x 2
181 - 212 bytes: UnicodeString x 1

شكرا :)

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

المحلول

يجب عليك الاتصال

aThread.WaitFor;

قبل تدمير الموضوع. هذا يتأكد من أن الخيط ينتهي بشكل صحيح. تدمير الخيط دون إنهاء الأمر ربما يؤدي إلى انتهاك وصول في طريقة التنفيذ، مما يؤدي إلى تسرب الذاكرة المعروضة بواسطة Fastmm.

تعديل بالنظر إلى حقيقة أن المشكلة قد تكون مكالمة الحظر في طريقة التنفيذ الخاصة بك، قد ترغب في ضبط TITHTTP.ReadTimeout لفترة زمنية معقولة وتحقق من إنهاء مؤشر الترابط في فترات منتظمة.

نصائح أخرى

تنتج Indy أيضا تسربات ذاكرة ثنائية أو ثلاثة، مثل عدد صحيح والقسم الحرج. لكنها قد تكون قد تم تسجيلها كما هو متوقع. لذلك لا أستطيع معرفة ما إذا كانت هذه هي تلك التي تراها. إذا كنت تقوم بتشغيل الكود الخاص بك 5 مرات، فهل ترى المزيد من التسرب مما تراه الآن؟

بالنسبة للانتظار الذي اقترحه Smasher، للاتصال قبل الاتصال مجانا. لا ينبغي أن تكون هناك حاجة إلى ذلك، ولا سبب مشاكلك، لأنه إذا قمت بفحص المدمرة من TTHREAD، فسترى بالضبط تم بالفعل.

لماذا تحصل على انتهاك وصول في تقرير التسرب الخاص بك، لا أعرف حقا. ومع ذلك، تقوم بتوصيل قطع الاتصال من خارج مؤشر الترابط الخارجي، في حين أن مكون Indy قيد الاستخدام في مؤشر ترابطك. لا تفعل ذلك، باستخدام نفس المكونات غير الآمنة غير الخيط من مؤشرات ترابط مختلفة يطلب مشكلة. قد يتسبب هذا في انتهاك وصولك. دع الخيط نفسه يقوم بكل المكالمات إلى مكون Indy.

الحد من القراءة كما اقترحه Smasher فكرة جيدة ولكن للتأكد من أن طلبك لا يمنع وقتا طويلا.

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