"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > كيف يمكن لتعدد العمليات منع تجميد واجهة المستخدم الرسومية أثناء العمليات طويلة الأمد؟

كيف يمكن لتعدد العمليات منع تجميد واجهة المستخدم الرسومية أثناء العمليات طويلة الأمد؟

تم النشر بتاريخ 2025-01-10
تصفح:193

How Can Multithreading Prevent GUI Freezes During Long-Running Operations?

استخدام المواضيع لإلغاء تجميد حلقة الحدث الرئيسية

في كثير من الأحيان، سوف "تتجمد" عناصر واجهة المستخدم الرسومية، مثل أشرطة التقدم، أثناء تنفيذ العمليات المكثفة في الموضوع الرئيسي. يحدث هذا بسبب حظر حلقة الحدث الرئيسية، التي تتعامل مع تفاعلات المستخدم وتحديثات واجهة المستخدم الرسومية. لمنع ذلك، يمكن استخدام تعدد مؤشرات الترابط لتشغيل المهام طويلة الأمد في سلسلة منفصلة.

في السيناريو المحدد المحدد، يجب أن تؤدي النقرة على الزر إلى بدء رسم متحرك لشريط التقدم لمدة خمس ثوانٍ. ومع ذلك، السلوك الملاحظة هو تجميد الزر أثناء هذه المدة. يمكن حل هذه المشكلة عن طريق استخدام سلاسل الرسائل، ولكن ربط الخيط في الخيط الرئيسي يؤدي إلى الانتظار حتى الانتهاء، مما يؤدي إلى حظر واجهة المستخدم الرسومية بشكل فعال.

النهج البديل: فصل المنطق إلى فئات

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

الحل باستخدام الترابط

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

    قم بإنشاء كائن قائمة انتظار في سلسلة المحادثات الرئيسية.
  1. ابدأ سلسلة جديدة مع إمكانية الوصول إلى قائمة الانتظار.
  2. تحقق بشكل دوري من قائمة الانتظار من الموضوع الرئيسي.

تنفيذ التعليمات البرمجية

يوجد أدناه مثال على التنفيذ باستخدام مهمة مترابطة للتعامل مع الرسوم المتحركة لشريط التقدم:

قائمة انتظار الاستيراد واجهة المستخدم الرسومية فئة: # رمز إعداد واجهة المستخدم الرسومية يظهر هنا بالتأكيد tb_click(النفس): التقدم الذاتي () self.prog_bar.start() قائمة الانتظار الذاتية = قائمة الانتظار. قائمة الانتظار () ThreadedTask(self.queue).start() self.master.after(100, self.process_queue) تعريف عملية قائمة الانتظار (النفس): يحاول: رسالة = self.queue.get_nowwait() # عرض نتيجة المهمة إذا لزم الأمر self.prog_bar.stop() باستثناء قائمة الانتظار. فارغة: self.master.after(100, self.process_queue) فئة ThreadedTask(threading.Thread): تعريف __init__(الذات، قائمة الانتظار): سوبر ().__init__() self.queue = queue تشغيل ديف (النفس): time.sleep(5) # محاكاة عملية طويلة الأمد self.queue.put("تم الانتهاء من المهمة")
import queue

class GUI:
    # Code for GUI setup goes here

    def tb_click(self):
        self.progress()
        self.prog_bar.start()
        self.queue = queue.Queue()
        ThreadedTask(self.queue).start()
        self.master.after(100, self.process_queue)

    def process_queue(self):
        try:
            msg = self.queue.get_nowait()
            # Show result of the task if needed
            self.prog_bar.stop()
        except queue.Empty:
            self.master.after(100, self.process_queue)

class ThreadedTask(threading.Thread):
    def __init__(self, queue):
        super().__init__()
        self.queue = queue
    def run(self):
        time.sleep(5)  # Simulate long running process
        self.queue.put("Task finished")
يعمل هذا الأسلوب بشكل فعال على إبقاء الخيط الرئيسي قيد التشغيل والاستجابة أثناء تنفيذ المهمة طويلة الأمد في خيط منفصل.

أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3