Ajouter le chargement asynchrone du graphe d'enquête #60
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Ajouter le chargement asynchrone du graphe d'enquête
Contexte
Le projet possède désormais :
InvestigationGraphModel;InvestigationGraphLoader;BackgroundTaskdéjà utilisé dans l'application ;Le chargeur synchrone construit correctement un graphe complet depuis SQLite,
mais il ne doit pas être appelé directement depuis un gestionnaire GTK lorsque
la base peut contenir beaucoup d'entités et de relations.
Objectif
Créer un service asynchrone chargé d'exécuter
investigation_graph_loader_load()en arrière-plan puis de restituer lerésultat sur le thread principal.
Le composant doit garantir :
Point d'architecture important
Le thread de fond ne doit pas utiliser directement la connexion
Databaseouverte par l'interface principale.
Chaque tâche doit ouvrir sa propre connexion SQLite à partir du chemin de la
base, puis :
Cette règle évite le partage implicite d'une connexion SQLite entre threads.
Fichiers
Créer :
Type opaque
Domaine d'erreur
Créer :
Ajouter :
Callback de fin
Définir :
Règles :
graph_modelnonNULLeterror == NULL;graph_model == NULLeterrornonNULL;Construction
Le constructeur doit :
NULL;GError **facultatif.Destruction
La destruction doit :
NULL;BackgroundTask;Démarrage
La fonction doit :
NULL;NULL;user_data;user_data_destroyune seule fois lorsque les données ne sont plusnécessaires ;
BackgroundTaskexistant ;Annulation
La fonction doit :
NULL;CANCELLEDsi l'annulation intervient avant la remisedu résultat ;
Le worker doit vérifier l'annulation au minimum :
État public
Ajouter :
La fonction doit :
FALSEpourNULL;TRUEuniquement entre le démarrage accepté et la finalisation ;Travail du worker
Le worker doit :
database_open(database_path);DATABASE_OPEN;InvestigationGraphLoader;investigation_graph_loader_load();LOAD;Au moindre échec :
Intégration avec BackgroundTask
Le composant doit utiliser l'infrastructure
BackgroundTaskdéjà présentedans le projet plutôt que créer une seconde abstraction concurrente.
Avant l'implémentation, vérifier l'API actuelle de
BackgroundTasket respecterses règles de cycle de vie.
Le nouveau composant peut encapsuler
BackgroundTask, mais ne doit pasdupliquer :
Propriété du résultat
Succès avant callback
Tant que le callback n'a pas commencé :
InvestigationGraphLoadTaskpossède le graphe.Entrée dans le callback
À l'entrée du callback :
NULL.Callback absent pour cause de destruction
Si l'objet est détruit avant la remise :
Tests
Créer :
Les tests doivent utiliser une base SQLite temporaire initialisée avec le
schéma réel.
La boucle principale GLib doit être utilisée pour attendre proprement les
callbacks.
Scénarios minimaux
NULL;NULL;user_data_destroyappelé une seule fois ;NULL;conçu comme réutilisable ;
InvestigationGraphLoader;GError **facultatif ;Vérification du thread principal
Le test doit enregistrer le thread appelant avant le démarrage :
Dans le callback :
Vérification de l'absence de blocage
Préparer une tâche de test contrôlée ou utiliser les points de synchronisation
de test de
BackgroundTask.Pendant que le worker est volontairement suspendu :
investigation_graph_load_task_start()doit déjà avoir rendu la main.Le test ne doit pas dépendre d'une durée arbitraire fragile.
Hooks de test
Lorsque nécessaire, ajouter des hooks compilés uniquement avec :
Ils peuvent permettre de :
Les hooks ne doivent pas apparaître dans la compilation de production.
Créer, uniquement si nécessaire :
Makefile
Ajouter :
La cible doit compiler :
tests/test_investigation_graph_load_task.c;src/core/investigation_graph_load_task.c;src/core/investigation_graph_loader.c;BackgroundTask;EntityDao;RelationDao;InvestigationGraphModel;EntityRecord;RelationRecord;databasenécessaires.Elle ne doit inclure aucun fichier GTK si
BackgroundTaskn'en dépend pas.Ajouter l'exécutable :
make test;make test;make clean.La compilation doit conserver :
Hors périmètre
Ce ticket ne couvre pas :
L'intégration du résultat dans la fenêtre principale fera l'objet du ticket
suivant.
Critères d'acceptation
BackgroundTaskest réutilisé.user_data_destroyest invoqué exactement une fois.make clean && make && make testréussit.git diff --checkne retourne aucune erreur.