【问题标题】:GObject.idle_add(), thread.join() and my program hangsGObject.idle_add()、thread.join() 和我的程序挂起
【发布时间】:2014-11-28 02:35:54
【问题描述】:

我有一个问题:我的主线程应该启动并加入一个运行大约 10-15 秒的线程。

所以:

  • 我的主线程启动一个子线程,它必须运行大约 10-15 秒
  • 我的主线程加入子线程:主线程需要子线程的结果
  • 在子线程运行的同时,我要更新 GUI,它只是一个进度条(可能每 0.2 秒)
  • 更新 GUI:我将使用 递归函数
  • 子线程结束,主线程得到结果

我的代码的问题是 Trovarete_Window 仅在工作函数结束时才会出现并开始更新。所以我的程序挂起/冻结,直到工人运行。

这是我的代码:

def collega_GUI(widget, args=()):

    builder.get_object('Trovarete_Window').show_all()
    progressbar.set_pulse_step(0.20)

    pulse()
    t = threading.Thread(target=worker)
    t.setDaemon(True)
    t.start()
    t.join()
    print 'a'


def pulse():

    if not event.is_set():
        progressbar.pulse()
        GObject.timeout_add(300, pulse)


def worker():
    #hard work

【问题讨论】:

  • collega_GUI 在哪里调用?主循环从哪里开始?
  • 另外,您需要worker 提供什么要求主线程阻塞直到完成?您的真实程序实际上是如何从工作线程中获取结果的?
  • 1) collega_gui 是从 Gtk.Button 调用的。 2)当子线程到达终点时,它会用结果设置一个变量。该变量由函数返回,在 join() 之后调用。
  • 已添加。这通常是在 GUI 事件处理程序中调用 join() 时发生的情况。不要在 GUI 事件处理程序中等待。不要拨打阻塞电话,不要睡觉,不要调用 join()。

标签: python multithreading gobject


【解决方案1】:

问题是您在collegea_GUI 中调用t.join()。调用t.join() 意味着你的主线程——运行事件循环的线程——被阻塞直到worker 完成。只要你被collegea_GUI 阻塞,你的主循环就不能运行,这意味着你安排的对pulse 的调用不能运行,GUI 也不能更新。

您需要执行与使用pulse 类似的操作,而不是调用t.join() - 安排一个函数运行,该函数执行非阻塞检查以查看worker 是否已完成。像这样的:

def collega_GUI(widget, args=()):

    builder.get_object('Trovarete_Window').show_all()
    progressbar.set_pulse_step(0.20)

    pulse()
    t = threading.Thread(target=worker)
    t.setDaemon(True)
    t.start()
    wait_for_t(t)

def wait_for_t(t):
   if not t.is_alive():
       t.join() # This won't block, since the thread isn't alive anymore
       print 'a'
       # Do whatever else you would do when join() (or maybe collega_GUI?) returns
   else:
       Gobject.timeout_add(200, wait_for_t, t)

【讨论】:

  • 没关系,谢谢回复,但是有一个问题:我不能把剩下的代码放在wait_for_t里面。 collega_GUI 是我的主线程,它拥有所有的数据结构。我会试着回答,虽然我还有一个小问题(我认为)
猜你喜欢
  • 2014-11-17
  • 1970-01-01
  • 2016-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-10
  • 2021-06-18
相关资源
最近更新 更多