File de tâches et panneau d’activité #37
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?
File de tâches et panneau d’activité
Contexte
Le ticket #036 a introduit
BackgroundTask, une primitive asynchrone capable de :Cette primitive ne gère cependant pas encore plusieurs tâches ni leur présentation dans l’interface.
Objectif
Créer un gestionnaire opaque :
chargé de suivre les tâches actives et terminées, puis ajouter un panneau GTK permettant de les consulter.
Le ticket doit permettre de voir :
Le gestionnaire reste indépendant de GTK.
Architecture attendue
Créer :
Relations :
Phase A —
TaskManager1. Type opaque
Dans :
déclarer :
Le type doit rester indépendant de GTK, SQLite et des enquêtes.
2. Callback de changement
Définir :
Le callback signale qu’un changement visible a eu lieu :
Le callback est une notification globale. Il ne transmet pas directement une tâche particulière.
3. API publique
Construction
Ajouter une tâche
Règles :
task_managerdevient propriétaire d’une référence supplémentaire ;NULLest refusé.Consulter les tâches
task_manager_get_task()retourne une nouvelle référence que l’appelant doit libérer.Retirer une tâche
La tâche n’est pas annulée automatiquement.
Supprimer les tâches terminées
États concernés :
Annuler toutes les tâches actives
Callback de changement
Le manager possède
user_dataaprès l’appel.Remplacer le callback existant doit détruire les anciennes données exactement une fois.
4. Domaine d’erreur
Définir :
Puis :
5. Structure interne recommandée
tasksdoit contenir des référencesBackgroundTask *.Configurer le
GPtrArrayavec :comme fonction de destruction.
6. Notification périodique
BackgroundTaskne possède pas encore de callback de progression.Pour ce ticket,
TaskPanelpeut rafraîchir périodiquement l’affichage avec :fréquence recommandée :
TaskManagernotifie immédiatement les changements structurels.La progression sera relue par le panneau.
Une API d’observation plus fine pourra être ajoutée plus tard si nécessaire.
Phase B — Tests de
TaskManagerCréer :
Tests minimaux
Construction
Vérifier :
Ajout
Ajouter une tâche et vérifier :
Doublon
Ajouter deux fois la même tâche :
Retrait
Retirer une tâche :
Retrait inconnu
Retirer une tâche absente :
Nettoyage des tâches terminées
Ajouter :
Vérifier que seules les tâches terminées sont supprimées.
Annulation globale
Ajouter plusieurs tâches actives et appeler :
Vérifier que chaque
GCancellablereçoit une demande d’annulation.Durée de vie
Vérifier que :
Phase C —
TaskPanel7. Type opaque
Dans :
déclarer :
API :
TaskPanelne devient pas propriétaire deTaskManager.TaskPaneldoit rester valide tant que le manager existe.8. Interface recommandée
Premier rendu simple :
Widgets GTK possibles :
GtkBox;GtkLabel;GtkProgressBar;GtkButton;GtkScrolledWindow.Ne pas utiliser encore de
GtkListViewsi cela complexifie inutilement le ticket.9. État visuel
Créer une fonction privée traduisant les états :
Une tâche en erreur doit afficher son message d’erreur sous forme courte.
Une tâche en cours doit afficher son message de progression lorsqu’il existe.
10. Bouton d’annulation
Le bouton
Annulerdoit être visible uniquement pour :Son callback appelle :
Le bouton ne doit pas retirer la tâche.
11. Bouton de nettoyage
Ajouter :
Il appelle :
Les tâches actives restent visibles.
12. Rafraîchissement périodique
TaskPaneldoit enregistrer une source GLib :Elle appelle :
Lors de
task_panel_free():g_source_remove();TaskManager.Phase D — Intégration GTK
13. Ajouter le panneau à
MainWindowModifier :
Changer la construction :
MainWindowdoit créer :Le panneau peut être placé :
Pour ce ticket, un volet inférieur sous
GtkPanedest acceptable.14. Ajouter
TaskManageràApplicationDans la structure privée :
Dans
application_new():En cas d’échec, nettoyer l’application.
Dans
application_on_activate():Dans
application_free():MainWindow;TaskManageraprès le panneau ;L’ordre doit éviter que
TaskPanellise un manager déjà détruit.Phase E — Tâche de démonstration
15. Ajouter temporairement une tâche de test
Pour valider l’interface, ajouter un bouton temporaire :
Il lance une
BackgroundTaskqui :Cette tâche doit être ajoutée au
TaskManager.Le bouton pourra être supprimé lorsque le premier véritable traitement asynchrone sera disponible.
Le code de démonstration doit rester clairement identifié :
Hors périmètre
Ne pas ajouter encore :
Critères d’acceptation
TaskManagerest opaque.TaskManagerne dépend pas de GTK.TaskManagerprotège sa collection avecGMutex.TaskPanelaffiche toutes les tâches.MainWindowne devient pas propriétaire du manager.makeréussit.make testréussit.git diff --checkne retourne aucune erreur.Audit attendu
Vérifier l’indépendance du manager :
Résultat attendu :
Vérifier les références :
Vérifier le rafraîchissement GTK :
Vérifier l’absence de threads bruts :
Résultat attendu :
Fichiers concernés
Commit attendu
Résultat attendu
Après ce ticket, Labfy possédera une infrastructure visible pour tous les futurs traitements longs :
Le ticket suivant pourra ajouter le registre des dépendances et lancer les premiers contrôles d’outils externes sans bloquer l’interface.