La aplicación que estoy escribiendo realiza un algoritmo de longitud que generalmente tarda unos minutos en terminar. Durante este tiempo, me gustaría mostrar al usuario una barra de progreso que indica qué parte del algoritmo se realiza de la forma más precisa posible.Patrones de diseño de barra de progreso?
El algoritmo se divide en varios pasos, cada uno con su propio tiempo típico. Por ejemplo-
- de inicialización (500 mili-sec)
- entradas de lectura (5 seg)
- la etapa 1 (30 seg)
- paso 2 (3 minutos)
- salidas de escritura (7 sec)
- cierre (10 mili-sec)
Cada paso puede reportar su progreso con bastante facilidad mediante el establecimiento de la r Está trabajando en ello, digamos [0 a 150] y luego informa el valor que completó en su bucle principal.
Lo que tengo configurado actualmente es un esquema de monitores de progreso anidados que forman una especie de árbol implícito de informes de progreso.
Todos los monitores de progreso heredan de una interfaz IProgressMonitor
:
class IProgressMonitor
{
public:
void setRange(int from, int to) = 0;
void setValue(int v) = 0;
};
La raíz del árbol es la ProgressMonitor que está conectado a la interfaz GUI real:
class GUIBarProgressMonitor : public IProgressMonitor
{
GUIBarProgressMonitor(ProgressBarWidget *);
};
cualquier otro nodo en el árbol de son monitores que toman el control de una parte del progreso principal:
class SubProgressMonitor : public IProgressMonitor
{
SubProgressMonitor(IProgressMonitor *parent, int parentFrom, int parentLength)
...
};
A SubProgressMonitor
toma el control del rango [parentFrom, parentFrom+parentLength]
de su matriz.
Con este esquema, puedo dividir estáticamente el progreso del nivel superior según la porción relativa esperada de cada paso en el tiempo global. Cada paso puede subdividirse en piezas, etc. '
La principal desventaja de esto es que la división es estática y se hace doloroso hacer cambios de acuerdo con las variables que se descubren en tiempo de ejecución.
Entonces, la pregunta: ¿hay algún patrón de diseño conocido para la supervisión del progreso que resuelva este problema?