Я создал инструмент с графическим интерфейсом с 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, я думаю?