L'applicazione che sto scrivendo esegue un algoritmo di lunghezza che di solito richiede alcuni minuti per terminare. Durante questo periodo mi piacerebbe mostrare all'utente una barra di avanzamento che indica quanto dell'algoritmo è fatto nel modo più preciso possibile.Modelli di progettazione Progress Bar?
L'algoritmo è diviso in più fasi, ognuna con il proprio tempismo tipico. Per esempio-
- inizializzazione (500 milli-secondi)
- ingressi di lettura (5 sec)
- passaggio 1 (30 sec)
- passo 2 (3 minuti)
- scrittura delle uscite (7 sec)
- spegnimento (10 milli-secondi)
Ogni passo può riferire i suoi progressi abbastanza facilmente impostando il r prima che funzioni, dì [da 0 a 150] e poi riferisci il valore completato nel suo ciclo principale.
Quello che attualmente ho impostato è uno schema di monitor di progresso nidificati che formano una sorta di albero implicito di segnalazione dei progressi.
Tutti i monitor progresso ereditano da un'interfaccia IProgressMonitor
:
class IProgressMonitor
{
public:
void setRange(int from, int to) = 0;
void setValue(int v) = 0;
};
La radice dell'albero è la ProgressMonitor che è collegato all'interfaccia GUI attuale:
class GUIBarProgressMonitor : public IProgressMonitor
{
GUIBarProgressMonitor(ProgressBarWidget *);
};
Qualsiasi altro nodo nell'albero sono i monitor che prendono il controllo di un pezzo del progresso genitore:
class SubProgressMonitor : public IProgressMonitor
{
SubProgressMonitor(IProgressMonitor *parent, int parentFrom, int parentLength)
...
};
A SubProgressMonitor
prende il controllo dell'intervallo [parentFrom, parentFrom+parentLength]
della madre.
Con questo schema sono in grado di dividere in modo statico l'avanzamento del livello superiore in base alla porzione relativa prevista di ciascun passaggio nel tempo globale. Ogni passo può essere ulteriormente suddiviso in pezzi ecc '
Lo svantaggio principale di questo è che la divisione è statica e diventa doloroso apportare modifiche in base alle variabili rilevate in fase di esecuzione.
Quindi la domanda: esistono modelli di progettazione noti per il monitoraggio dell'avanzamento che risolvono questo problema?