geo2france / idg-qgis-plugin

Plugin QGIS pour la consultation des données des différentes Infrastructure de Données Géographiques en France
GNU General Public License v2.0
14 stars 4 forks source link

Ne pas bloquer le thread principal #30

Closed jbdesbas closed 9 months ago

jbdesbas commented 1 year ago

Lors du téléchargement et du chargement des fichiers projets de config, le thread principal risque de bloquer plusieurs secondes (freeze de l'interface).

Exemple : https://docs.qgis.org/3.22/en/docs/pyqgis_developer_cookbook/tasks.html#examples

Guts commented 1 year ago

En effet, lors de l'intégration dans le profil de démo et de la présentation du plugin du CRAIG aux journées QGIS, j'ai pu me rendre compte que le chargement était fait au chargement de QGIS alors qu'il vaut mieux utiliser le signal de quand l'interface est chargée.

Exemple https://github.com/geotribu/qtribu/blob/main/qtribu/plugin_main.py#L157

Par ailleurs, plutôt que de coder vous-même le QgsThread et le téléchargement, il est de bon ton d'utiliser le processing de téléchargement de fichier déjà tout bien intégré : https://qgis.org/pyqgis/3.28/core/QgsFileDownloader.html

Exemple : https://github.com/geotribu/qtribu/blob/main/qtribu/toolbelt/network_manager.py#L163-L188

bchartier commented 1 year ago

Super. Merci beaucoup pour ton aide sur ce sujet.

[Juste pour être sûr que tu regardes au bon endroit dans le code, le code actuel est en chantier en se rebasant sur ton template CookieCutter. C'est dans la branche dev.]

Guts commented 1 year ago

[Juste pour être sûr que tu regardes au bon endroit dans le code, le code actuel est en chantier en se rebasant sur ton template CookieCutter. C'est dans la branche dev.]

Tu fais bien de me le dire !

Je passais juste faire coucou :)

jbdesbas commented 1 year ago

Réaliser le téléchargement des fichiers distants après le chargement de l'interface QGIS devrait permettre de résoudre la lenteur (voir les crash) de QGIS au démarrage provoquée par le plugin


2023-07-26T08:18:27     INFO    First Aid chargé (paquet firstaid)
2023-07-26T08:18:27     INFO    QuickOSM chargé (paquet QuickOSM)
2023-07-26T08:18:34     INFO    IDG chargé (paquet idg)
2023-07-26T08:18:34     INFO    Copy_Coords chargé (paquet copy_coords)
2023-07-26T08:18:34     INFO    Get WKT chargé (paquet QGIS3-getWKT)```
jbdesbas commented 1 year ago

@Guts merci pour tes exemples sur qtribu, le plugin ne retarde plus le lancement de QGIS ou ne freeze plus l'interface. 😀️

Si les fichiers sont téléchargés avec QgsThread (non bloquant), y a t'il encore un intérêt à différer le chargement du plugin après le chargement de l'interface QGIS ? Le souci c'est que la fonction connectée au signal initializationCompleted n'est pas exécutée si le plugin est activé après le lancement de l'interface QGIS (activation du plugin depuis le gestionnaire d'extension, rechargement du plugin via Plugin Reloader ou tout autre méthode). Je n'observe pas de différence sur le temps de lancement en exécutant le téléchargement des fichiers au moment de l'initialisation du plugin ou après le chargement de l'interface QGIS.

Guts commented 1 year ago

@Guts merci pour tes exemples sur qtribu, le plugin ne retarde plus le lancement de QGIS ou ne freeze plus l'interface. grinning

Va falloir le mettre dans les crédits de votre plugin :laughing: !

Le souci c'est que la fonction connectée au signal initializationCompleted n'est pas exécutée si le plugin est activé après le lancement de l'interface QGIS (activation du plugin depuis le gestionnaire d'extension, rechargement du plugin via Plugin Reloader ou tout autre méthode).

En effet, il faut prévoir de connecter les fonctions d'initialisation du plugin (téléchargement, authentification, config...) sur le signal d'activation du plugin également et qu'elles soient idempotentes au max.

Je n'observe pas de différence sur le temps de lancement en exécutant le téléchargement des fichiers au moment de l'initialisation du plugin ou après le chargement de l'interface QGIS.

Je pense que c'est normal vu que le téléchargement est justement délégué à un ou plusieurs threads indépendants du thread principal, sur lequel sont faites les mesures.