繁体   English   中英

pygtk应用程序中的单独线程

[英]separate threads in pygtk application

我在使用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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM