我在使用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
答案 0 :(得分:8)
首先,不要将threading.Thread
作为子类,使用Thread(target=callable).start()
。
其次,可能导致明显阻止的原因是gtk.main_iteration
采用参数block
,默认为True
,因此您对gtk.main_iteration
的调用实际上会阻止当没有要迭代的事件时。哪个可以解决:
gtk.main_iteration(block=False)
然而,没有真正解释为什么你会使用这个被黑客攻击的循环而不是实际的gtk主循环。如果你已经在主循环中运行它,那么我会建议你做错了。如果您向我们提供更多详细信息和/或完整示例,我可以扩展您的选项。
第三,这只是稍后出现:始终始终 始终 确保您已在任何pygtk中调用gtk.gdk.threads_init
应用程序与线程。运行线程时,GTK +有不同的代码路径,需要知道使用它们。
我写了a small article about pygtk and threads,为你提供了一个小抽象,所以你永远不必担心这些事情。该帖子还包括一个进度条示例。