wxpython Python知道线程何时完成->卡住

时间:2020-05-13 10:00:04

标签: python wxpython python-multithreading pypubsub

我正在继续进行计算机检查的程序。 它基于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标签。

到目前为止一切顺利! allis运作良好。 但是现在我想知道所有启动的线程何时完成。这就是问题所在。 如果我在线程上使用join(),则PUBSUB GUI更新在所有线程完成之前无法正常工作。 如果我在doCheck函数中使用while语句来循环“ isAlive()”,则它基本上会执行相同的操作,等待所有操作结束。同样,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)

ps。 message参数用于了解应更新哪个标签...

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

谢谢

1 个答案:

答案 0 :(得分:1)

解决方案之一可能是:

启动另一个将要加入的线程,并在所有线程加入后,向主线程发布一条消息。收到该消息后,您知道线程已完成,您可以继续进行工作...

或者,这有点有点怪异:做一个函数,每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()