Aplikacja, którą piszę, wykonuje algorytm długości, który zwykle zajmuje kilka minut. W tym czasie chciałbym pokazać użytkownikowi pasek postępu, który wskazuje, jak bardzo algorytm jest wykonany tak precyzyjnie, jak to tylko możliwe.Wzorce projektowe paska postępu?
Algorytm jest podzielony na kilka etapów, każdy z własnym typowym taktowaniem. Dla instance-
- inicjalizacji (500 milisekund)
- wejścia odczytu (5 s)
- etap 1, (30 s)
- Etap 2 (3 minuty)
- wyjścia pisania (7 s)
- wyłączania (10 milisekund)
Każdy krok może zgłosić swoje postępy dość łatwo poprzez ustawienie R i przeprowadź jego pracę, powiedzmy [0 do 150], a następnie podaj wartość, którą ukończyła w swojej głównej pętli.
To, co obecnie skonfigurowałem, to schemat zagnieżdżonych monitorów postępu, które tworzą rodzaj niejawnego drzewa raportów postępu.
Wszystkie monitory postępu dziedziczyć z interfejsu IProgressMonitor
:
class IProgressMonitor
{
public:
void setRange(int from, int to) = 0;
void setValue(int v) = 0;
};
Korzeniem drzewa jest ProgressMonitor który jest podłączony do rzeczywistego interfejsu GUI:
class GUIBarProgressMonitor : public IProgressMonitor
{
GUIBarProgressMonitor(ProgressBarWidget *);
};
Każdy inny węzeł w drzewie to monitory, które przejmują kontrolę nad postępem nadrzędnym:
class SubProgressMonitor : public IProgressMonitor
{
SubProgressMonitor(IProgressMonitor *parent, int parentFrom, int parentLength)
...
};
A SubProgressMonitor
przejmuje kontrolę nad obszarem nadrzędnym w zakresie [parentFrom, parentFrom+parentLength]
.
Za pomocą tego schematu mogę statycznie dzielić postęp najwyższego poziomu zgodnie z oczekiwaną względną częścią każdego kroku w globalnym taktowaniu. Każdy krok można następnie podzielić na części itp. "
Główną wadą tego jest podział na statyczny i bolesne jest wprowadzanie zmian w zależności od zmiennych, które są wykrywane w czasie wykonywania.
Pytanie więc: czy istnieją jakieś znane wzorce projektowe do monitorowania postępu, które rozwiązują ten problem?