问题描述
我正在研究一个计算机检查程序,其中有几项检查。 一旦检查完成,结果将进入数据库。 到现在为止还挺好。 由于单独的函数冻结了应用程序(基于wx),因此我在代码中引入了线程。哪个工作正常,快速。 线程看起来像这样:
check2 = thread2()
check3 = thread3()
check3 = thread4()
check4 = thread5()
check1.start()
check2.start()
check3.start()
check4.start()
check5.start()
以上是def,由按钮按下事件启动。 这一切都很好。现在,我必须将结果上传到数据库中。当我添加功能例如在代码之后执行uploadDB(arg []),尽管线程仍然很忙,该函数仍将启动。
这意味着我必须等到完成为止。因此,我现在使用的代码有些不同,例如:
threads=[]
c1 = check1()
threads.append(c1)
c2 = check2()
threads.append(c2)
...
for x in threads:
x.start()
# wait for all threads to finish
for x in threads:
x.join()
uploadDB(arg[])
这也很好,但是在连接期间,接口再次冻结,因为一切都在等待直到线程完成...冻结实际上是我不想要的...但是如果我不这样做使用联接...我不知道线程何时完成上传。 我想应该有一种更简单的方法来做到这一点?
再次感谢您的帮助!〜 /碧玉
解决方法
我现在有一个临时解决方案是运行一个thead侦听器。每个线程都向侦听器发布“运行”,并且每个线程都为线程数量保留一个整数。在线程末尾(wx.callafter),将发布“完成”,并且整数将再次减小。因此,当整数为0时,表示所有线程均已完成,例如数据库的东西。 但是,这似乎不是检查线程是否完成的真正有效方法。 但是问题仍然存在。 “ join()”正在冻结……如果我设置了while循环,我基本上会创建与join()语句相同的情况……它将冻结应用程序。 因此,欢迎提出任何建议以提高效率!
谢谢!