Sobes.tech
Middle+

Wyjaśnij, jak działa pętla zdarzeń w kontekście języka Dart i frameworka Flutter.

sobes.tech AI

Odpowiedź od AI

Dart jest jednoprocesowy, ale używa pętli zdarzeń (Event Loop) do obsługi operacji asynchronicznych.

Pętla zdarzeń składa się z dwóch głównych kolejek:

  1. Kolejka mikrotasków (Microtask Queue): dla wysokopriorytetowych, krótkich zadań asynchronicznych. Są wykonywane natychmiast po zakończeniu bieżącej operacji i przed rozpoczęciem kolejnej iteracji pętli zdarzeń.
  2. Kolejka zdarzeń (Event Queue): dla zdarzeń zewnętrznych (takich jak I/O, timery, wejście użytkownika). Zadania z tej kolejki są przetwarzane po opróżnieniu kolejki mikrotasków.

Proces działania:

  • Główny wątek wykonuje kod synchroniczny.
  • Gdy napotka operację asynchroniczną (np. Future, Stream, timer), jest ona rejestrowana i trafia do odpowiedniej kolejki.
  • Pętla zdarzeń stale sprawdza kolejkę mikrotasków. Jeśli nie jest pusta, wykonuje jej zadania aż do opróżnienia.
  • Następnie sprawdza kolejkę zdarzeń. Jeśli nie jest pusta, pobiera pierwsze zadanie i je wykonuje.
  • Cykl powtarza się, aż obie kolejki będą puste i nie będzie oczekujących operacji asynchronicznych.

Przykład użycia Future i scheduleMicrotask:

void main() {
  print('1. Początek main');

  // Dodaje mikrozadanie do kolejki mikrotasków
  scheduleMicrotask(() {
    print('3. Mikrozadanie wykonywane');
  });

  // Tworzy operację asynchroniczną, która zostanie dodana do kolejki zdarzeń po jej zakończeniu
  Future(() {
    print('4. Future wykonywane (z kolejki zdarzeń)');
  });

  // Dodaje kolejne mikrozadanie
  scheduleMicrotask(() {
    print('5. Druga mikrozadanie wykonywane');
  });

  // Tworzy Future z opóźnieniem, również trafia do kolejki zdarzeń
  Future.delayed(Duration(milliseconds: 10), () {
    print('6. Opóźnione Future wykonywane (z kolejki zdarzeń)');
  });

  print('2. Koniec main');
}

// Oczekiwany porządek wykonania:
// 1. Początek main
// 2. Koniec main
// 3. Mikrozadanie wykonywane
// 5. Druga mikrozadanie wykonywane
// 4. Future wykonywane (z kolejki zdarzeń)
// 6. Opóźnione Future wykonywane (z kolejki zdarzeń)

W Flutterze, pętla zdarzeń zarządza wykonywaniem zadań UI (np. rysowaniem widgetów), obsługą gestów, żądaniami sieciowymi i innymi operacjami asynchronicznymi, zapewniając płynne działanie aplikacji bez blokowania interfejsu użytkownika. Ważne zadania Fluttera (np. planowanie klatek do renderowania) często korzystają z kolejki mikrotasków, aby osiągnąć wyższy priorytet.