首页 > 解决方案 > wxpython Python 知道线程何时完成 -> 卡住

问题描述

我正在继续我的计算机检查程序。它是基于 WXPYTHON 的。

该程序显示一个带有标签的界面和一个“运行”按钮,当单击该按钮时,它会在 mainFrame 类中启动“doCheck”函数

doCheck 然后启动所有线程:

Thread1 = computerCheck()
Thread2 = countProcess()
Thread3 = findProcess()
Thread4 = findProtection()
Thread5 = bitlockerCheck()

Thread1.start()
Thread2.start()
Thread3.start()
Thread4.start()
Thread5.start()

线程正在执行一些 WMI 检查等并通过使用 pubsub.sendMessage() 报告 MainFrame 类具有一个侦听器函数,该函数在收到消息时更新 GUI 标签。

到目前为止,一切都很好!艾利斯运作良好。但是现在我想知道所有启动的线程何时完成。这就是问题所在......如果我在线程上使用 join(),则 PUBSUB GUI 更新在所有线程完成之前都不起作用。如果我在循环“isAlive()”的 doCheck 函数中使用 while 语句,它基本上会执行相同的操作,等待一切结束。同样,PUBSUB 也被停止了......

所以我被困在这里。到目前为止,该程序运行良好,但现在我需要在所有检查完成/完成后启动下一步,但我无法弄清楚如何在不阻止 PUBSUB 阻止运行时更新的情况下完成此操作......

实际线程的片段:

class findProcess(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)

    def run(self):
        my_object = dict(status='Running', result='')
        wx.CallAfter(pub.sendMessage, 'testListener', message=3,arg2=my_object)

附言。message 参数用于知道应该更新哪些标签...

有什么建议么?我可以在需要时发布更多代码。

谢谢

标签: pythonwxpythonpython-multithreadingpypubsub

解决方案


解决方案之一可能是:

启动另一个将加入的线程,当所有线程都加入时,向主线程发布消息。根据该消息,您知道线程已完成,您可以继续工作......

或者,这个有点骇人听闻:创建一个函数,每 100 毫秒检查一次所有线程的 is_alive。像这样的东西:

def check_threads_finished(self):
    for i in self.my_threads:
        if i.is_alive():
            wx.CallLater(100, self.check_threads_finished)
            return
    # finished
    self.do_whatever_is_needed_after_threads_finished()

推荐阅读