pygtk应用程序中的单独线程
我在处理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和线程的小文章,为您提供了一个小的抽象,因此您不必担心这些事情。该帖子还包含进度条示例。