سؤال

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

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

وthread.start_new_thread (self.images_download، (مسار، صفحة)

وهذا لن ينجح. الطريقة الوحيدة التي يمكنني الحصول على برنامجي للوصول الى موضوع هو عن طريق استخدام

وgtk.threads_init ()

وقبل البدء في أي موضوع. الآن أنه بتحميل الصور ولكن يبقى واجهة المستخدم الرسومية لا تستجيب. أنا googled هذا وحاولت وضع gtk.threads_enter وgtk.threads_leave حول المواضيع ولكن فقط لا يعمل.

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

المحلول

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

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

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

وثانيا، إذا كنت تفضل استخدام المواضيع لسبب ما، سوف تحتاج إلى فهم GTK + خيوط نموذج قليلا.

ويجب أن تبدأ من خلال قراءة وجتك التعليمات الدخول على هذا الموضوع ، وكنت قد تجد هذا بلوق وظيفة من السهل أن نفهم أيضا.

والآن، إلى المضاربة. وأنا على التخمين الذي تحاول لتحديث GTK UI الخاص بك من موضوع، وليس التعامل مع قفل بشكل صحيح. إذا كان هذا هو الحال، كنت أفضل حالا لتأجيل الآن كافة التحديثات UI الخاص بك تريد القيام به من المواضيع للموضوع الرئيسي باستخدام gobject.idle_add () بهذه الطريقة، سيتم إجراء جميع المكالمات UI من الخيط الرئيسي. وهو نموذج عقلي الأسهل لمتابعة في البرمجة الخاصة بك.

وبمجرد أن تشعر بأنك حقا فهم الترابط ونماذج تأمين، هل يمكن النظر تحديث واجهة المستخدم من المواضيع الخاصة بك، ولكن من السهل أن تنسى threads_enter () / threads_leave ()

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