5.4. Communication entre les fils d'Anaconda
Certaines des actions que vous devez effectuer au cours du processus d'installation peuvent prendre beaucoup de temps. Par exemple, l'analyse des disques à la recherche de partitions existantes ou le téléchargement des métadonnées des paquets. Pour vous éviter d'attendre et rester réactif, Anaconda exécute ces actions dans des threads distincts.
La boîte à outils Gtk ne prend pas en charge les changements d'éléments à partir de plusieurs fils d'exécution. La boucle événementielle principale de Gtk s'exécute dans le thread principal du processus Anaconda processus. Par conséquent, toutes les actions relatives à l'interface graphique doivent être effectuées dans le thread principal. Pour ce faire, il faut utiliser GLib.idle_add
, ce qui n'est pas toujours facile ou souhaitable. Plusieurs fonctions d'aide et décorateurs définis dans le module pyanaconda.ui.gui.utils peuvent ajouter à la difficulté.
Les décorateurs @gtk_action_wait
et @gtk_action_nowait
modifient la fonction ou la méthode décorée de telle sorte que lorsque cette fonction ou cette méthode est appelée, elle est automatiquement mise en file d'attente dans la boucle principale de Gtk qui s'exécute dans le fil d'exécution principal. La valeur de retour est soit renvoyée à l'appelant, soit abandonnée, respectivement.
Dans une communication entre un rayon et un moyeu, un rayon annonce qu'il est prêt et qu'il n'est pas bloqué. La file d'attente de messages hubQ
gère cette fonction et vérifie périodiquement la boucle d'événements principale. Lorsqu'un rayon devient accessible, il envoie un message à la file d'attente annonçant le changement et le fait qu'il ne doit plus être bloqué.
Il en va de même lorsqu'un rayon doit actualiser son statut ou compléter un drapeau. Le hub Configuration and Progress
dispose d'une file d'attente différente, appelée progressQ
, qui sert à transférer les mises à jour de l'état d'avancement de l'installation.
Ces mécanismes sont également utilisés pour l'interface textuelle. En mode texte, il n'y a pas de boucle principale, mais la saisie au clavier prend la majeure partie du temps.