Sobes.tech
Middle+

Explique comment fonctionne la boucle d'événements dans le contexte du langage Dart et du framework Flutter.

sobes.tech IA

Réponse de l'IA

Dart est monothread, mais utilise la boucle d'événements (Event Loop) pour gérer les opérations asynchrones.

La boucle d'événements se compose de deux files principales :

  1. File de microtâches (Microtask Queue) : pour les tâches asynchrones de haute priorité et courtes. Elles s'exécutent immédiatement après la fin de l'opération en cours et avant le début de la prochaine itération de la boucle.
  2. File d'événements (Event Queue) : pour les événements externes (comme I/O, minuteries, entrée utilisateur). Les tâches de cette file sont traitées après que la file de microtâches est vide.

Processus de fonctionnement :

  • Le thread principal exécute du code synchrone.
  • Lorsqu'une opération asynchrone est rencontrée (par exemple, Future, Stream, minuterie), elle est enregistrée et envoyée dans la file appropriée.
  • La boucle d'événements vérifie constamment la file de microtâches. Si elle n'est pas vide, ses tâches sont exécutées jusqu'à ce qu'elle soit vide.
  • Ensuite, elle vérifie la file d'événements. Si elle n'est pas vide, la première tâche est prise et exécutée.
  • Ce cycle se répète jusqu'à ce que les deux files soient vides et qu'il n'y ait plus d'opérations asynchrones en attente.

Exemple d'utilisation de Future et scheduleMicrotask :

void main() {
  print('1. Début du main');

  // Ajoute une microtâche à la file de microtâches
  scheduleMicrotask(() {
    print('3. Microtâche en cours');
  });

  // Crée une opération asynchrone qui sera ajoutée à la file d'événements après sa fin
  Future(() {
    print('4. Future en cours (de la file d\'événements)');
  });

  // Ajoute une autre microtâche à la file de microtâches
  scheduleMicrotask(() {
    print('5. Deuxième microtâche en cours');
  });

  // Crée un Future avec délai, également envoyé à la file d'événements
  Future.delayed(Duration(milliseconds: 10), () {
    print('6. Future différé en cours (de la file d\'événements)');
  });

  print('2. Fin du main');
}

// Ordre d'exécution attendu :
// 1. Début du main
// 2. Fin du main
// 3. Microtâche en cours
// 5. Deuxième microtâche en cours
// 4. Future en cours (de la file d\'événements)
// 6. Future différé en cours (de la file d\'événements)

Dans Flutter, la boucle d'événements gère l'exécution des tâches UI (repeinture des widgets), la gestion des gestes, les requêtes réseau et autres opérations asynchrones, assurant un fonctionnement fluide de l'application sans bloquer l'interface utilisateur. Les tâches importantes de Flutter (par exemple, la planification de frames pour le rendu) utilisent souvent la file de microtâches pour atteindre une priorité plus élevée.