سؤال

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

ورمز ذات الصلة:

class MTP_Connection(threading.Thread):
    def __init__(self, HOME_DIR, username):
        self.filename = HOME_DIR + "mtp-dump_" + username
        threading.Thread.__init__(self)

    def run(self):
        #test run
        for i in range(1, 10):
            time.sleep(1)
            print i   

..........................

start_time = time.time()
conn = MTP_Connection(self.HOME_DIR, self.username)
conn.start()
progress_bar = ProgressBar(self.tree.get_widget("progressbar"),
                           update_speed=100, pulse_mode=True)
while conn.isAlive():
    while gtk.events_pending():
        gtk.main_iteration()
    if time.time() - start_time > 5:
        self.write_info("problems closing connection.")
        break
#after this the program continues normally, but my conn thread stops
هل كانت مفيدة؟

المحلول

أولا، لا threading.Thread فرعية، واستخدام Thread(target=callable).start().

وثانيا، وربما كان السبب في كتلة واضح هو أن gtk.main_iteration يأخذ block المعلمة، التي افتراضات إلى True، لذلك دعوتكم لgtk.main_iteration ستمنع فعلا عندما تكون هناك أي أحداث تكرار جرا. والتي يمكن حلها مع:

gtk.main_iteration(block=False)

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

وثالثا، وهذا جاء فقط في وقت لاحق: دائما دائما <م> دائما على دائما تأكد من قمت بالاتصال gtk.gdk.threads_init في أي تطبيق جتك مع المواضيع. GTK + ديها مسارات مختلفة متاحة عند تشغيل مترابطة، وأنه يحتاج إلى معرفته لاستخدام هذه.

مقالة صغيرة عن جتك والمواضيع أن يقدم لك التجريد صغير لذلك لا داعي للقلق حول هذه الأمور. ويشمل هذا المنصب أيضا مثال شريط التقدم.

scroll top