Подтверждение PyQt Завершение нескольких QThreads - PullRequest
0 голосов
/ 07 июня 2018

Я создал инструмент с графическим интерфейсом с Qt Creator и Python.В GUI пользователь выбирает типы шейп-файлов, которые он / она хочет сгенерировать.Скрипт сохраняет выбор в списке.Генерация каждого типа шейп-файла обрабатывается отдельными QThreads.Каждый QThread будет печатать некоторые сообщения, такие как «Обработка AAA ....».Функция кнопки «Выполнить» будет тогда выполнять:

if optionA in selection_list:
    QThreadA.start()
if optionB in selection_list:
    QThreadB.start()
if optionC in selection_list:
    QThreadC.start()

Теперь я пытаюсь заставить GUI всплывающее окно, когда все QThreads заканчивают работу.Я нашел здесь 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'sРекомендация, я придумаю это:

dict = {optionA: QThreadA, optionB: QThreadB, optionC: QThreadC}
for option in selection_list:
    dict[option].start()

, чтобы избежать предыдущих глупых «если», но я до сих пор не нашел эффективного способа завершить все темы, так как:

for options in selection_list:
    dict[option].wait()

, похоже, не работает, потому что .wait () приостановит цикл for, я думаю?

1 Ответ

0 голосов
/ 30 июня 2018
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

ВСЕ наборы открывают ваш графический интерфейс здесь

...