لا يهتم الاتصال أثناء استخدام Indy
سؤال
أريد تنزيل ملف من الإنترنت وأتصور أن هذا يجب أن يكون مهمة بسيطة. تجربة عدة طرق مختلفة وجدت أن كل واحد لديه عيب خاص به. القضايا الرئيسية هي:
- يتجمد التطبيق حتى يقوم بتنزيل الملف
- يتجمد التطبيق إلى الأبد إذا فقد اتصال الإنترنت/لا يستجيب الخادم.
(تفاصيل:
كيفية استرداد ملف من الإنترنت عبر HTTP؟
لا يهتم الاتصال أثناء تنزيل الملف من الإنترنت )
لذا ، استخدمت أخيرًا الاقتراحات التي تلقيتها من عدة أشخاص لاستخدام مكتبات "Pro" مثل Indy. ومع ذلك ، فإن Indy ليس أفضل بكثير من قطع الكود التي جربتها (ولكن من الصعب الحفاظ عليها). أثناء استخدام Indy ، لا يتجمد التطبيق فقط لفترات قصيرة ، لذلك لا يزال قابلاً للاستخدام (بطريقة ما). ومع ذلك ، لا يمكن إيقاف تشغيل التطبيق حتى ينتهي التنزيل (أبدًا إذا تم كسر اتصالات الإنترنت).
أبلغ أشخاص آخرون عن نفس المشكلة: http://borland.newsgroups.archived.at/public.delphi.internet.winsock/200609/0609079112.html
https://forums.embarcadero.com/thread.jspa؟threadid=25199&tstart=90
لذلك ، هناك بعض القرصنة التي كان علي القيام بها إلى Tidantifreleze من أجل جعلها تعمل؟
أيضا ، لم يتم التعرف على خاصية ConnectTimeout.
fIDHTTP := TIDHTTP.Create(NIL);
fIDHTTP.ConnectTimeout:=5000;
هل يجب أن أسقط Indy وأعود إلى الفكرة الأصلية لتنزيل الملف في موضوع منفصل وإنهاء مؤشر الترابط عندما لا يستجيب (على الأقل بهذه الطريقة أتخلص من مكتبات الطرف الثالث)؟ سيكون هناك آثار جانبية غير متوقعة إذا قمت بذلك؟
باستخدام: Delphi 7 ، Indy 10.1.5 10.5 (ربما).
شكرًا
المحلول
ليس من الصعب للغاية حل هذه الأنواع من المشاكل. أول ما عليك فعله هو التأكد من معالجة الأخطاء التي تمت معالجتها بشكل صحيح. إذا فشل شيء ما ، فتأكد من تنظيف كل شيء بشكل صحيح. أبعد من ذلك تأكد من أن رمز التنزيل جزء من مؤشر ترابط منفصل. إذا كانت هناك أي مشكلة يمكنك دائمًا إنهاء الموضوع من البرنامج الرئيسي. إليك الرمز (لتنزيل فقط ، وليس الخيط) الذي يعمل بشكل جيد بالنسبة لي.
with TDownloadURL.Create(nil) do
try
URL := 'myurltodownload.com';
filename := 'locationtosaveto';
try
ExecuteTarget(nil);
except
result := false;
end;
if not FileExists(filename) then
result := false;
finally
clear;
free;
end;
نصائح أخرى
ربما تحتاج إلى استخدام Indy the Indy Way: استخدام المواضيع. تم تصميم Indy خصيصًا للعمل في وضع الحظر ، لأن هذه هي الطريقة التي تعمل بها معظم بروتوكولات الإنترنت (مثال: مع HTTP ، على مستوى البروتوكول ، ترسل طلبًا ثم تقرأ الاستجابة. لا ترسل وتتلقى في نفس الوقت). من المفترض أن يساعدك Tidantifrezeze في استخدام بعض وظائف Indy دون التعامل مع المواضيع ؛ لم أستخدم ذلك أبدًا لأنه ، على الأقل مفاهيمي ، إنه اختراق قبيح.
إذا كنت لا ترغب في التعامل مع المواضيع ، فيجب عليك إلقاء نظرة على ICS ( رابط إلى الصفحة الرئيسية ICS ). تم تصميم ICS ليتم استخدامه في وضع Async ، دون ترابط. لا يحتاج إلى ما يعادل Tidantifreze لأنه لا يحظر. يمكنك البدء في التنزيل وتعامل مع بعض الأحداث للحصول على إحراز تقدم وإخطارات الانتهاء. ICS هو تماما معروفة ومهنية وتستخدم بعنف مثل إندي.