Skip to content

Accedere all’interfaccia utente da un Thread

Poter aggiornare l’interfaccia utente da un Thread sembrerebbe una cosa banale, ma in realtà è un task più complesso. Ma ci sono ottime ragioni per cui è così e sapere come farlo permette di ottenere applicazioni stabili e più efficienti.

Aggiornare direttamente l’interfaccia da un Thread non è sempre una buona idea. In realtà si rallenta l’esecuzione del Thread perchè nella maggiorparte dei casi si richiama l’aggiornamento con una frequenza inutile rispetto al necessario. Inoltre non tutti i controlli, che ricordo in Xojo sono quelli nativi, sono progettati per gestire la chiamata da un Thread diverso da quello principale.

Per evitare problemi Xojo impedisce questa operazione lanciando un’eccezione in caso di accesso all’interfaccia utente dall’interno di un Thread.

Come risolvere il problema?

Tra gli esempi presenti nell’installazione di Xojo, c’è un progetto che permette di vedere una delle possibili strategie. Questo progetto si trova nella cartella Desktop/UpdatingUIFromThread/UIThreadingWithTimer.xojo_binary_project.

In pratica abbiamo il nostro Thread che esegue il suo processo aggiornando variabili e un Timer che legge le variabili aggiornando l’interfaccia utente.

Con una strategia simile è possibile creare un controllo personalizzato Thread che crea al suo interno il Timer, tramite il constructor della sottoclasse Thread, e assegna come action del Timer un metodo della sottoclasse che richiama l’evento di aggiornamento. Questo evento avrà come parametro in dictionary con i dati da visualizzare.

Ovviamente è possibile inserire dei metodi da richiamare prina dell’inizio dell’esecuzione del Thread, magari per leggere i valori dall’interfaccia, e un altro per segnalare la fine del Thread.

Un esempio, interessante anche per l’uso del lock delle risorse, è presente tra gli esempio dell’installazione di Xojo: Desktop/UpdatingUIFromThread/UpdatingThreadWithTask.xojo_binary_project.

Vale la pena di studiarlo per capirne il meccanismo. In ogni caso è sempre possibile copiare la cartella Task del progetto e utilizzarla nei propri progetti per implementare immediatamente questo tipo di meccanismo.