Python threading-Warning: QWaitCondition: уничтожено, пока потоки все еще ожидают - PullRequest
0 голосов
/ 20 марта 2020

Что я пытаюсь сделать: загрузить список шейп-файлов в QGIS-проект и сохранить его в моей файловой системе.

Что происходит: это работает. Файл (QGIS-Project) сохраняется со всеми фигурами, указанными в нем, в том порядке, в котором я хочу их видеть. Но есть и это предупреждение: «QWaitCondition: уничтожено, пока потоки все еще ждут», которое возникает после записи файла проекта, потому что exitQgis () делает именно то, что должен. Очистка.

Это часть Python моего кода, которая вызывает предупреждение.

import os
from qgis.core import *

# Supply path to qgis install location
QgsApplication.setPrefixPath("$QGISPathInAppsDir", True)
os.environ['QGIS_PREFIX_PATH'] = '$QGISPathInAppsDir'
os.environ['GDAL_DATA'] = '$GdalDataPath'

qgs = QgsApplication([], False)

qgs.initQgis()

project = QgsProject.instance()

allShps = $allShpsFROMs2gStringforPyList

for shp in reversed(allShps):
    shpName = shp.split('/')[-1]
    vlayer = QgsVectorLayer(shp, shpName, 'ogr')
    project.instance().addMapLayer(vlayer, True)

project.write("$pathToSaveProject")

qgs.exitQgis()

Две, возможно, интересные вещи:

  1. Я попробовал подход с многопоточностью, а также подход concurent.future, где оба кажутся неудачными и вызывают "QObject :: setParent" : Невозможно установить родительский элемент, новый родительский элемент находится в другом потоке "Предупреждения заменены на l oop, например, с этим кодом:

    def addLayer(shp):
        shpName = shp.split('/')[-1]
        vlayer = QgsVectorLayer(shp, shpName, 'ogr')
        project.instance().addMapLayer(vlayer, True)
    
    with concurrent.futures.ThreadPoolExecutor() as executor:
        allShpsReversedOrder = reversed(allShps)
        executor.map(addLayer, allShpsReversedOrder)
    
  2. , если список содержит три или менее элементов ( в этом случае пути к шейп-файлам) предупреждение не вызывается. Только тогда, когда список содержит более трех элементов.

Наконец, мой вопрос: возможно ли вообще избежать повышения исходного предупреждения под углом, к которому я приближаюсь? Потому что я не понимаю, где я использую потоки, когда я просто через oop.

...