sottovento
08-12-2016, 14:00
Cari colleghi
sto mettendo le mani in una HMI composta da una sola finestra WPF piena di controlli, sia standard sia custom (viste 3D).
L'HMI funziona abbastanza bene ed e' anche ben organizzata; ci sono tuttavia dei problemi sul refresh.
Infatti, questa HMI rinfresca i dati prendendoli da database su evento (riceve degli eventi quando il database e' modificato).
Ogni query e' effettuata in modalita' asincrona: si lancia la query, si passa a fare altro (in pratica non si freeza l'hmi ma i controlli che aspettano i dati mostrano un'icona di attesa, tipo youtube) e quando i dati sono disponibili li si preleva e si aggiornano le varie tabelle/controlli/viste 3d/...
Il problema e' che ci sono alcune sezioni che dipendono dalle altre, e possono essere aggiornate solo in determinate condizioni.
Per esempio, nel codice di refresh di una particolare sezione si potrebbe trovare un codice simile:
void refreshSection1()
{
if (!refreshSection2InProgress)
{
<qui c'e' il lancio della query di refresh, la cattura dei dati,....>
}
}
In questo modo, l'HMI non e' mai fastidiosamente bloccata; pero' e' ovvio che puo' succedere che una parte dell'HMI non venga rinfrescata quando necessario!
Sto quindi cercando il modo piu' indolore per evitare di perdere il refresh
1 senza stravolgere il codice
2 senza inserire inutili blocchi dell'HMI
Per esempio, potrei pensare di cambiare il tipo delle variabili "refreshSectionXXXInProgress" in modo che siano delle sezioni critiche o simili ed attendere che il refresh sia finito prima di partire con il refresh della parte successiva. Questo pero' bloccherebbe l'interfaccia utente.
Suggerimenti?
La mia idea sarebbe quella di introdurre un sistema di notifica quando un refresh e' finito, cosi' che si possa ripetere l'operazione che e' stata precedentemente abortita. Pero' e' una modifica pesante e va a pasticciare parecchio il software... sbaglio?
sto mettendo le mani in una HMI composta da una sola finestra WPF piena di controlli, sia standard sia custom (viste 3D).
L'HMI funziona abbastanza bene ed e' anche ben organizzata; ci sono tuttavia dei problemi sul refresh.
Infatti, questa HMI rinfresca i dati prendendoli da database su evento (riceve degli eventi quando il database e' modificato).
Ogni query e' effettuata in modalita' asincrona: si lancia la query, si passa a fare altro (in pratica non si freeza l'hmi ma i controlli che aspettano i dati mostrano un'icona di attesa, tipo youtube) e quando i dati sono disponibili li si preleva e si aggiornano le varie tabelle/controlli/viste 3d/...
Il problema e' che ci sono alcune sezioni che dipendono dalle altre, e possono essere aggiornate solo in determinate condizioni.
Per esempio, nel codice di refresh di una particolare sezione si potrebbe trovare un codice simile:
void refreshSection1()
{
if (!refreshSection2InProgress)
{
<qui c'e' il lancio della query di refresh, la cattura dei dati,....>
}
}
In questo modo, l'HMI non e' mai fastidiosamente bloccata; pero' e' ovvio che puo' succedere che una parte dell'HMI non venga rinfrescata quando necessario!
Sto quindi cercando il modo piu' indolore per evitare di perdere il refresh
1 senza stravolgere il codice
2 senza inserire inutili blocchi dell'HMI
Per esempio, potrei pensare di cambiare il tipo delle variabili "refreshSectionXXXInProgress" in modo che siano delle sezioni critiche o simili ed attendere che il refresh sia finito prima di partire con il refresh della parte successiva. Questo pero' bloccherebbe l'interfaccia utente.
Suggerimenti?
La mia idea sarebbe quella di introdurre un sistema di notifica quando un refresh e' finito, cosi' che si possa ripetere l'operazione che e' stata precedentemente abortita. Pero' e' una modifica pesante e va a pasticciare parecchio il software... sbaglio?