إظهار طرق مختلفة لاستخدام المواضيع في دلفي

الكثير من مستخدمي Delphi يخطئون في التفكير في أن الخيط هو نوع من السحر الذي سيحسن أداء تطبيقهم. لسوء الحظ ، هذا بعيد عن صحيح. إن أكبر خطأ عند محاولة تنفيذ مؤشر ترابط يجعله يصل مباشرة إلى عناصر التحكم المرئية للتطبيق. لكن هذه الضوابط البصرية لا يمكن أن تعمل إلا في سياق موضوع التطبيق الرئيسي للتطبيق. يجب أن يكون استخدام مؤشر ترابط آخر لتحديث عناصر التحكم في واجهة المستخدم مخططة وتنفيذها بعناية فائقة. وفي معظم الحالات ، ربما لا يكون الحل الصحيح للمشكلة على الإطلاق.
ببساطة ، إطار VCL لـ Delphi ليس آمنًا. في حين أن هناك العديد من الطرق لدمج مؤشر ترابط في واجهة المستخدم الخاصة بك ، لا يوجد حل واحد يناسب الجميع. سوف يختلف دائمًا اعتمادًا على ما تحاول إنجازه. معظم الوقت ، يريد الناس تحقيق أداء أفضل (السرعة). ولكن نادراً ما يتم ذلك باستخدام موضوع. بدلاً من ذلك ، فإن السيناريوهات الأكثر شيوعًا حيث يتم دمج مؤشر ترابط في واجهة المستخدم هو الحفاظ على استجابة واجهة المستخدم خلال مهمة طويلة.
لهذا ، سوف نتخيل تطبيقًا بسيطًا مع زر واحد فقط يقوم بتنزيل ملف من الإنترنت عند النقر عليه. يحتوي التطبيق بالفعل على مؤشر ترابط رئيسي واحد يستخدم لواجهة المستخدم بأكملها. على نظام Windows ، يعني هذا إرسال/استلام رسائل Windows ، والرسم إلى قماش تحكم ، والتعرف على تفاعل المستخدم ، وما إلى ذلك. هذا الموضوع هو في الأساس حلقة عملاقة تدور بسرعة كبيرة. لكل ثورة من خيط الغزل هذا ، يتم تنفيذ بعض الكود.
في بيئة واحدة ملولبة ، سيمنع تنزيل الملف هذه الحلقة من الغزل ، حتى يتم الانتهاء من التنزيل. خلال هذا الوقت ، لم يعد هذا الموضوع قادرًا على إجراء أي تحديثات واجهة المستخدم ، أو اكتشاف نقرات المستخدم ، أو أي شيء. هذا هو ما يسبب وضع Windows (لا يستجيب) في عنوان هذه النماذج ، لأنه ، كما يقول تمامًا ، إنه لا يستجيب.
هذا هو المكان الذي تأتي فيه المواضيع الإضافية. إنها تحتاج إلى الاستجابة للنوافذ. بدلاً من حظر مؤشر ترابط واجهة المستخدم الرئيسية مع تنزيل الملف العملاق هذا ، يمكنك وضع تنزيل هذا الملف في موضوع آخر. الأمر بسيط ، أليس كذلك؟
قد تسأل نفسك "كيف أراقب التقدم؟" أو "كيف يتم إخباري عند الانتهاء؟" هذا يعني أن مؤشر ترابط التنزيل يحتاج إلى التفاعل بطريقة ما مع الموضوع الرئيسي. هذا هو بالضبط المكان الذي يأتي فيه الارتباك. لا يمكن أن يتدخل مؤشر ترابط واحد ببساطة مع خيط آخر ، لأنه لا يوجد شيء في أي موضوع واحد موجود بالفعل. هناك حلقتان منفصلتان الآن ، وعندما تريد تحديث واجهة المستخدم ، يمكن أن يكون مؤشر ترابط واجهة المستخدم في أي مكان يفعل أي شيء. الأهم من ذلك ، لنفترض أن مؤشر ترابط واجهة المستخدم الرئيسي هو في عملية كتابة سلسلة إلى نفس خاصية التحكم التي يريد مؤشر ترابطك الآخر أيضًا الكتابة إليها. الآن لديك موضوعان يحاولان الكتابة إلى نفس عنوان الذاكرة ، مما قد يؤدي إلى مشكلات لا يمكن التنبؤ بها.
عن طريق المزامنة. تحتوي فئة Tthread من Delphi على طريقة تزامن () والتي تسمح لخيط بالتفاعل مع مؤشر ترابط واجهة المستخدم الرئيسية فقط في لحظة عندما يتصرف بشكل صحيح بالفعل ، عندما يتوقع بالفعل مثل هذا الحدوث. لا يتم تشغيل الكود الذي تتم مزامنته من مؤشر ترابط آخر بالفعل في سياق هذا الموضوع - يتم تشغيله دائمًا في سياق سلسلة واجهة المستخدم الرئيسية. هذه هي فكرة Synchronize () ، هي تنفيذ التعليمات البرمجية في مؤشر ترابط واجهة المستخدم.
لذلك في النهاية ، لا تستخدم VCL بالفعل من الخيط. بدلاً من ذلك ، يرسل مؤشر ترابطك إشارة إلى مؤشر الترابط الرئيسي ، وفقط عندما يكون الخيط الرئيسي جاهزًا ، فسيقوم بتنفيذ هذا الرمز. وفي الوقت نفسه ، يتم حظر خيطك الثانوي أثناء انتظار الانتهاء من الخيط الرئيسي.
ثم هناك خطأ في التفكير في أن عملية واجهة المستخدم الكبيرة ستكون أفضل في موضوع. دعنا نقول أن لديك قائمة حيث تريد ملايين العناصر. بالطبع سيستغرق الأمر وقتًا ، وخلال هذا الوقت لن يستجيب طلبك. مرة أخرى. لذا فقط نقل هذا الرمز إلى موضوع ، أليس كذلك؟
مرة أخرى ، يجب إجراء أي تفاعل واجهة المستخدم من الخيط الرئيسي ، والخيط الرئيسي فقط. تكون المواضيع مفيدة إذا كنت بحاجة إلى إجراء حسابات مطولة ، أو معالجة كميات هائلة من البيانات ، أو انتظر استجابة من مورد بعيد ، أو أي شيء آخر يستغرق وقتًا طويلاً ولا يرتبط مباشرة بموجب واجهة المستخدم.
من الصعب القول. ولكن هناك ممارسة شائعة يُنصح بها بشدة عند كتابة موضوع: ضع رمز سلسلة الرسائل في وحدة خاصة به. يجب عزل هذه الوحدة عن أي وحدة واجهة المستخدم الأخرى. لا ينبغي أن يكون لديها حتى أي وحدة ذات صلة VCL في شرط استخدامها. لا ينبغي أن يعرف الموضوع حتى كيف يتم استخدامه. يجب أن تكون في الأساس دمية ، مع الغرض الوحيد من أداء مهمتك الطويلة. عندما يتعلق الأمر بتحديثات واجهة المستخدم من سلسلة رسائل ، من الأفضل تحقيق ذلك من خلال الأحداث المتزامنة.
بالضبط ما يبدو. إنه حدث متزامن ، كما هو موضح سابقًا. الحدث هو ببساطة مؤشر لإجراء يمكنك تعيينه للمعلومات قبل أن يبدأ. داخل الخيط ، عندما تحتاج إلى تحديث واجهة المستخدم ، يمكنك بعد ذلك استخدام Synchronize () لتشغيل هذا الحدث. مع هذا التصميم ، لن يتعين على الخيط أبدًا أن يعرف أبدًا أنه يتم استخدامه من قبل واجهة المستخدم. في الوقت نفسه ، يمكنك أيضًا إنجاز التجريد عن غير قصد. يصبح الخيط قابلًا للاستخدام. يمكنك توصيله ببعض المشاريع الأخرى التي قد لا تحتوي حتى على واجهة مستخدم (دعنا نقول خدمة Windows).
فيما يلي بعض الروابط المباشرة للموارد ذات الصلة حول سلامة مؤشر ترابط VCL ، في حال كنت لا ترغب في البحث ...
يوضح هذا التطبيق استخدام المواضيع في دلفي. نظرًا لوجود العديد من الأشياء المختلفة التي يجب معرفتها ، يتم تقسيمها إلى أقسام مختلفة لأغراض مختلفة. يحتوي كل موضوع على وحدة نموذجية واحدة على الأقل (مضمنة في ورقة علامات التبويب) ، ووحدة مستقلة واحدة على الأقل تحتوي على وظائفها بصرف النظر عن واجهة المستخدم. يتم ذلك عن قصد ، لإظهار أنه ينبغي عزل المواضيع من أي واجهة مستخدم.
الشكل الرئيسي نفسه ليس له أي منطق في الواقع. كل ما يفعله هو تضمين النماذج في علامات التبويب. في معالج الأحداث FormCreate() ، يقوم بإجراء العديد من المكالمات إلى EmbedForm() الذي يقوم بتثبيت نموذج لكل ورقة علامة تبويب.
في الواقع استخدام التطبيق بسيط للغاية. يمكنك فقط الانتقال إلى إحدى علامات التبويب ، وسيحصل كل واحدة على تعليماته الخاصة.


يوضح كيف يمكن تنزيل ملف من الإنترنت في موضوع. هناك دالة عالمية واحدة محددة DownloadFile() التي تؤدي التنزيل. يحتوي واجهة المستخدم على 3 أزرار:
افتراضيًا ، يكون عنوان URL الذي سيتم تنزيله هو ملف اختبار يوفره ThinkBroadBand.com ، ولكن يمكنك استخدام أي عنوان URL الذي ترغب فيه. يمكنك أيضًا اختيار الموقع لحفظ الملف إليه. هذا عرض تجريبي بسيط للغاية ، لذلك يجب تعديل اسم الملف/تمديد اسم الملف المحلي حسب احتياجاتك - لن يتغير تلقائيًا لعنوان URL الذي تقوم بتنزيله (كما تفعل المتصفحات عادةً).

يوضح كيفية تحديث شريط التقدم من مؤشر ترابط يقوم بمهمة طويلة.

يوضح استخدام اتصال قاعدة البيانات داخل مؤشر ترابط ومزامنة البيانات مع مؤشر ترابط واجهة المستخدم.

يوضح عدة مؤشرات ترابط تستهلك دورات وحدة المعالجة المركزية الضخمة لتحميل اختبار المعالج الخاص بك.