4

我在线程化我的 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
4

1 回答 1

9

首先,不要子类化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 和线程的小文章,它为您提供了一个小的抽象,因此您永远不必担心这些事情。该帖子还包括一个进度条示例。

于 2009-03-26T14:31:59.863 回答