﻿# `gestione_aree_frame_async.py`

## Scopo

Questo modulo fornisce l'infrastruttura async usata dalle finestre GUI:

- loop asincrono globale;
- overlay di attesa;
- runner che collega coroutine e callback Tk.

## Flusso infrastrutturale

```{mermaid}
flowchart TD
    A["Metodo finestra GUI"] --> B["AsyncRunner.run(awaitable)"]
    B --> C{"busy overlay richiesto?"}
    C -- Si --> D["BusyOverlay.show()"]
    C -- No --> E["Salta overlay"]
    D --> F["run_coroutine_threadsafe(awaitable, loop globale)"]
    E --> F
    F --> G["Polling del Future"]
    G --> H{"Future completato?"}
    H -- No --> G
    H -- Si --> I{"Successo o errore?"}
    I -- Successo --> J["widget.after(..., on_success)"]
    I -- Errore --> K["widget.after(..., on_error)"]
    J --> L["BusyOverlay.hide()"]
    K --> L
```

## Schema di componenti

```{mermaid}
flowchart LR
    Holder["_LoopHolder"] --> Loop["get_global_loop"]
    Loop --> Runner["AsyncRunner"]
    Overlay["BusyOverlay"] --> Runner
    Runner --> GUI["Moduli GUI"]
```

## Note

- Il modulo fa da ponte tra thread Tk e thread del loop asincrono.
- `BusyOverlay` e riusato da piu finestre, quindi e un componente condiviso.
- `AsyncRunner` evita che i moduli GUI gestiscano direttamente i `Future`.
