Files
SAE32_2025/temp/learning-Log.txt
T

50 lines
3.9 KiB
Plaintext
Raw Normal View History

2026-01-03 13:08:16 +01:00
Learning log Problème de blocage de la fenêtre après la sauvegarde:
Après avoir implémenté la fonctionnalité dexport au format PIF depuis linterface du convertisseur,
jai rencontré un problème important : une fois que je cliquais sur le bouton dexportation,
la fenêtre se figeait complètement. Elle restait visible, mais impossible à fermer ou à interagir avec.
Le programme semblait bloqué.
En analysant le comportement et en utilisant des impressions de debug, jai constaté que le blocage n’était pas lié à l’écriture du
fichier ni à la logique du convertisseur, mais bien à un problème de gestion des threads dans Swing.
Swing repose sur un fonctionnement particulier : toute linterface graphique est gérée par un seul thread dédié,
appelé lEvent Dispatch Thread (EDT). Ce thread est responsable de tout ce qui concerne linterface utilisateur :
la gestion des clics, le rafraîchissement de la fenêtre, la fermeture, le dessin et laffichage en général.
Tant que ce thread tourne correctement, lapplication reste réactive.
LEDT ne démarre réellement quaprès lappel à la méthode permettant dafficher la fenêtre. À partir de ce moment,
toutes les opérations qui modifient linterface devraient strictement être exécutées sur ce thread.
Cest une règle fondamentale pour éviter les blocages.
En examinant mon programme, je me suis rendu compte que le problème venait de la manière dont javais structuré mon point dentrée.
Mon programme principal créait la fenêtre, le contrôleur, puis lançait immédiatement tout le processus de conversion,
qui incluait le chargement du fichier image, le calcul des fréquences, la construction des arbres de Huffman,
la génération des codes canoniques, et éventuellement l’écriture du fichier PIF.
Ce sont des opérations potentiellement longues et qui se déroulaient sur le thread principal,
avant même que lEDT ne prenne le relais pour gérer linterface.
Cela avait pour conséquences que Swing se retrouvait dans un état instable, puisque certaines opérations graphiques avaient été réalisées
hors du thread dédié.
Cest exactement ce qui provoquait le gel de linterface : une fois le fichier enregistré, la fenêtre ne répondait plus car
lEDT était bloqué ou interrompu, empêchant toute interaction, y compris la fermeture de la fenêtre.
Une fois le problème identifié, les solutions étaient claires. Il fallait sassurer que toutes les opérations qui touchent
a linterface graphique soient exécutées sur lEvent Dispatch Thread. Cela signifie que toute interaction, y compris louverture
dun sélecteur de fichiers, doit obligatoirement être déclenchée dans ce contexte. De plus, il fallait veiller à ne pas exécuter
de longues opérations synchrones avant le démarrage complet de lEDT.
La solution consiste donc à déléguer lappel du processus de conversion au thread graphique, en utilisant le mécanisme fourni par
Swing pour garantir que le code sexécute sur lEDT. Une autre possibilité serait dexécuter les opérations lourdes dans un thread en
arrière-plan pour éviter de bloquer linterface, mais dans tous les cas le respect strict de la séparation entre traitements et interface
est essentiel.
Grâce à cette analyse, jai mieux compris la manière dont Swing gère les threads et jai pu corriger la structure de mon programme
afin quil reste totalement réactif, même après lexport. Cette expérience ma rappelé limportance de maîtriser les principes fondamentaux
des bibliothèques graphiques et leurs contraintes en matière de multithreading.
2026-01-02 20:52:44 +01:00
le proble aussi avec mon flush infini