python - 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 参数用于知道应该更新哪些标签...
有什么建议么?我可以在需要时发布更多代码。
谢谢
解决方案
解决方案之一可能是:
启动另一个将加入的线程,当所有线程都加入时,向主线程发布消息。根据该消息,您知道线程已完成,您可以继续工作......
或者,这个有点骇人听闻:创建一个函数,每 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()
推荐阅读
- cucumberjs - Cucumber.js 在钩子之前无法处理标记的场景
- css - 在 Shiny R 中设置页列的高度
- asp.net-core - 只处理具有查询字符串的 URL,并将其余的传递给 IIS?
- php - PHP:我可以每 30 天调用一次函数吗
- python - 绘制决策边界时更改输入数据点
- r - 将一个单元格中的多个值分成多个单元格
- python - Vim 'gF' 命令不捕获 python 回溯消息行号
- javascript - 为什么我检查两个对象数组之间差异的条件是错误的?
- php - 如何在directadmin的子域上上传laravel项目?
- flutter - 如何在 Flutter 中制作 Facebook 邮箱?