多个QThread的PyQt确认完成
PyQt Confirmation Finishing of Multiple QThreads
我使用 Qt Creator 和 Python 创建了一个 GUI 工具。在 GUI 中,用户将 select 类型的 shapefile he/she 想要生成。该脚本将 selection 存储在列表中。每种类型的 shapefile 的生成由单独的 QThreads 处理。每个 QThread 都会打印一些消息,例如 "Processing AAA...."。 "run" 按钮函数将执行:
if optionA in selection_list:
QThreadA.start()
if optionB in selection_list:
QThreadB.start()
if optionC in selection_list:
QThreadC.start()
现在我试图让 GUI 在所有 QThreads 完成时弹出 window。我在这里 https://riverbankcomputing.com/pipermail/pyqt/2007-May/016026.html 发现 QThread.wait() 与 thread.join() 的工作方式相同,我正在尝试利用它。
我做不到
if optionA in selection_list:
QThreadA.start()
if optionB in selection_list:
QThreadB.start()
if optionC in selection_list:
QThreadC.start()
QThreadA.wait()
QThreadB.wait()
QThreadC.wait()
print("All set")
因为有时并非所有 QThreads 都是 运行。
但如果我这样做
if optionA in selection_list:
QThreadA.start()
if optionB in selection_list:
QThreadB.start()
if optionC in selection_list:
QThreadC.start()
if optionA in selection_list:
QThreadA.wait()
if optionB in selection_list:
QThreadB.wait()
if optionC in selection_list:
QThreadC.wait()
print("All set")
这不仅看起来很蠢,当我点击 "run" 按钮时,我还会得到
"All set"
"Processing AAA..."
"Processing BBB..."
"Processing CCC..."
当显然一切都已完成时,这些消息一起出现,而不是我希望看到的:
"Processing AAA..."
some time passed...
"Processing BBB..."
some more time passed...
"Processing CCC..."
some more time passed...
"All set"
这里发生的事情的顺序是什么?这基本上使消息变得无用,因为用户只有在一切最终完成时才能看到它们。
可以使用一些关于如何重建函数的帮助。
编辑:根据@Nimish Bansal 的推荐,我想出了这个:
dict = {optionA: QThreadA, optionB: QThreadB, optionC: QThreadC}
for option in selection_list:
dict[option].start()
避免之前愚蠢的"if"s,但我仍然没有找到一个有效的方法来结束所有线程,因为:
for options in selection_list:
dict[option].wait()
似乎不起作用,因为我猜 .wait() 会暂停 for 循环?
def run_fun(a):
print("processing",a)
time.sleep(2)
import threading
A=threading.Thread(target=run_fun,args=('aaa',))
B=threading.Thread(target=run_fun,args=('bbb',))
C=threading.Thread(target=run_fun,args=('ccc',))
def join_threads(listi):
for j in listi:
j.join()
print("ALL set","open your gui here")
A.start()
B.start()
C.start()
threading.Thread(target=join_threads,args=([A,B,C],)).start()
输出
处理aaa
正在处理 bbb
正在处理 ccc
ALL set open your gui here
我使用 Qt Creator 和 Python 创建了一个 GUI 工具。在 GUI 中,用户将 select 类型的 shapefile he/she 想要生成。该脚本将 selection 存储在列表中。每种类型的 shapefile 的生成由单独的 QThreads 处理。每个 QThread 都会打印一些消息,例如 "Processing AAA...."。 "run" 按钮函数将执行:
if optionA in selection_list:
QThreadA.start()
if optionB in selection_list:
QThreadB.start()
if optionC in selection_list:
QThreadC.start()
现在我试图让 GUI 在所有 QThreads 完成时弹出 window。我在这里 https://riverbankcomputing.com/pipermail/pyqt/2007-May/016026.html 发现 QThread.wait() 与 thread.join() 的工作方式相同,我正在尝试利用它。
我做不到
if optionA in selection_list:
QThreadA.start()
if optionB in selection_list:
QThreadB.start()
if optionC in selection_list:
QThreadC.start()
QThreadA.wait()
QThreadB.wait()
QThreadC.wait()
print("All set")
因为有时并非所有 QThreads 都是 运行。
但如果我这样做
if optionA in selection_list:
QThreadA.start()
if optionB in selection_list:
QThreadB.start()
if optionC in selection_list:
QThreadC.start()
if optionA in selection_list:
QThreadA.wait()
if optionB in selection_list:
QThreadB.wait()
if optionC in selection_list:
QThreadC.wait()
print("All set")
这不仅看起来很蠢,当我点击 "run" 按钮时,我还会得到
"All set"
"Processing AAA..."
"Processing BBB..."
"Processing CCC..."
当显然一切都已完成时,这些消息一起出现,而不是我希望看到的:
"Processing AAA..."
some time passed...
"Processing BBB..."
some more time passed...
"Processing CCC..."
some more time passed...
"All set"
这里发生的事情的顺序是什么?这基本上使消息变得无用,因为用户只有在一切最终完成时才能看到它们。
可以使用一些关于如何重建函数的帮助。
编辑:根据@Nimish Bansal 的推荐,我想出了这个:
dict = {optionA: QThreadA, optionB: QThreadB, optionC: QThreadC}
for option in selection_list:
dict[option].start()
避免之前愚蠢的"if"s,但我仍然没有找到一个有效的方法来结束所有线程,因为:
for options in selection_list:
dict[option].wait()
似乎不起作用,因为我猜 .wait() 会暂停 for 循环?
def run_fun(a):
print("processing",a)
time.sleep(2)
import threading
A=threading.Thread(target=run_fun,args=('aaa',))
B=threading.Thread(target=run_fun,args=('bbb',))
C=threading.Thread(target=run_fun,args=('ccc',))
def join_threads(listi):
for j in listi:
j.join()
print("ALL set","open your gui here")
A.start()
B.start()
C.start()
threading.Thread(target=join_threads,args=([A,B,C],)).start()
输出
处理aaa
正在处理 bbb
正在处理 ccc
ALL set open your gui here