wxpython Python知道线程何时结束 -> 卡住了。

问题描述 投票:0回答:1

我在继续我的程序,做电脑检查。它是基于WXPYTHON的。

程序显示了一个带有标签的界面和一个 "运行 "按钮,当按钮被点击时,就会启动mainFrame类中的 "doCheck "功能。

然后启动所有的线程,这些线程正在进行一些WMI检查等,并通过使用pubsub.sendMessage()报告。

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更新不工作,直到所有线程都完成。如果我在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参数用来知道哪个标签要更新.....

有什么建议吗?如果需要的话,我可以发更多的代码。

谅谅

python wxpython python-multithreading pypubsub
1个回答
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()
© www.soinside.com 2019 - 2024. All rights reserved.