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