سؤال

أريد تنزيل ملف من الإنترنت وأتصور أن هذا يجب أن يكون مهمة بسيطة. تجربة عدة طرق مختلفة وجدت أن كل واحد لديه عيب خاص به. القضايا الرئيسية هي:

  • يتجمد التطبيق حتى يقوم بتنزيل الملف
  • يتجمد التطبيق إلى الأبد إذا فقد اتصال الإنترنت/لا يستجيب الخادم.

(تفاصيل:

كيفية استرداد ملف من الإنترنت عبر 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 هو تماما معروفة ومهنية وتستخدم بعنف مثل إندي.

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