отдельные темы в приложении pygtk - PullRequest
4 голосов
/ 26 марта 2009

У меня возникли проблемы с многопоточностью моего приложения pyGTK. Я даю ветке некоторое время для выполнения своей задачи, если есть проблема, я все равно продолжаю, но предупреждаю пользователя. Однако, как только я продолжу, этот поток останавливается, пока не будет вызван 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

1 Ответ

8 голосов
/ 26 марта 2009

Во-первых, не делайте подкласс threading.Thread, используйте Thread(target=callable).start().

Во-вторых, и, вероятно, причина вашего очевидного блока в том, что gtk.main_iteration принимает параметр block, который по умолчанию равен True, поэтому ваш вызов gtk.main_iteration будет фактически блокироваться, когда нет событий для повторения , Что можно решить с помощью:

gtk.main_iteration(block=False)

Однако, нет никакого реального объяснения, почему вы бы использовали этот взломанный цикл вместо реального основного цикла gtk. Если вы уже выполняете это внутри основного цикла, я бы сказал, что вы делаете не то, что нужно. Я могу расширить ваши варианты, если вы дадите нам немного больше деталей и / или полный пример.

В-третьих, и это только позже: всегда всегда всегда всегда убедитесь, что вы вызывали gtk.gdk.threads_init в любом приложении pygtk с потоками. GTK + имеет разные пути кода при работе в потоке, и он должен знать, чтобы использовать их.

Я написал небольшую статью о pygtk и потоках , которая предлагает вам небольшую абстракцию, чтобы вам никогда не приходилось беспокоиться об этих вещах. Этот пост также содержит пример индикатора выполнения.

...