Różnice między wybraną wersją a wersją aktualną.
Both sides previous revision Previous revision Next revision | Previous revision Next revision Both sides next revision | ||
timer [2009/04/18 20:15] lucas |
timer [2009/04/18 21:50] lucas |
||
---|---|---|---|
Linia 2: | Linia 2: | ||
**Łukasz Dobrodziej T-TIZ** | **Łukasz Dobrodziej T-TIZ** | ||
- | |||
- | |||
===== Wstęp ===== | ===== Wstęp ===== | ||
- | Biblioteka Timer zapewnia trzy klasy, które umożliwiają kontrolę czasu - klasę ''timer'' do mierzenia czasu, który upłynął od danego momentu, klasę ''progress_timer'' do raportowania czasu oraz klasę ''progress_display'' do wyświetlania wskaźnika postępu. | + | Biblioteka Timer zapewnia trzy klasy, które umożliwiają kontrolę czasu - klasę ''timer'' do mierzenia czasu, który upłynął od danej chwili, klasę ''progress_timer'' do raportowania czasu oraz klasę ''progress_display'' do wyświetlania wskaźnika postępu. Klasy są wyposażone w obsługę wyjątków np. konstruktory mogą rzucić ''std::bad_alloc''. W praktyce rzucanie wyjątków przez obiekty tych klas jest mało prawdopodobne. |
===== Klasa timer ===== | ===== Klasa timer ===== | ||
Linia 22: | Linia 20: | ||
boost::timer t; // uruchomienie zegara (rozpoczecie odmierzania czasu) | boost::timer t; // uruchomienie zegara (rozpoczecie odmierzania czasu) | ||
for (int i=0; i<10000000; ++i) std::rand(); | for (int i=0; i<10000000; ++i) std::rand(); | ||
- | std::cout << t.elapsed() << std::endl; //wyswietlenie aktualnej wartosci timeru | + | std::cout << t.elapsed() << std::endl; //wyswietlenie aktualnej wartosci zegara |
</code> | </code> | ||
Linia 39: | Linia 37: | ||
</code> | </code> | ||
+ | ===== Klasa progress_display ===== | ||
+ | |||
+ | Wyświetla wskaźnik postępu do zdefiniowanego celu w odpowiedniej formie i miejscu. Pozwala to na powiadomienie użytkownika, że program działa i w jakim jest stanie. Klasa może być wykorzystana, gdy na przykład chcemy wykonać skomplikowane obliczenia na dużym kontenerze danych. Klasa udostępnia następujące metody: | ||
+ | |||
+ | * **''count()''** zwraca wartość wewnętrznego licznika. | ||
+ | * **''expected_count()''** zwraca wartość docelową, podaną podczas kontrukcji obiektu. | ||
+ | * **''restart(unsigned long expected_count)''** ustawia nową wartość docelową, zeruje licznik. | ||
+ | Klasa ma przeładowane operatory ''++'' i ''+='', które służą do zwiększania licznika (i jeżeli to konieczne dorysowania odpowiedniego znaku postępu). Dodatkowo przy pomocy konstruktora możemy zmienić miejsce wyświetlania paska postępu operacji oraz możemy dodać tytuł dla każdego wiersza. Deklaracja konstruktora ma następującą postać: | ||
+ | <code cpp> | ||
+ | progress_display( unsigned long expected_count, | ||
+ | std::ostream& os, // os jest sugestia, moze byc zignorowany | ||
+ | const std::string & s1 = "\n", | ||
+ | const std::string & s2 = "", | ||
+ | const std::string & s3 = "" ) | ||
+ | </code> | ||
+ | |||
+ | Przykład użycia: | ||
+ | <code cpp> | ||
+ | progress_display show_progress( big_map.size() ); //inicjalizacja obiektu, zdefiniowanie wartosci docelowej | ||
+ | for ( big_map_t::iterator itr = big_map:begin(); | ||
+ | itr != big_map.end(); ++itr ) | ||
+ | { | ||
+ | // wykonywanie jakichs obliczen | ||
+ | ++show_progress; //wyswietlanie postepu na standardowym wyjsciu | ||
+ | } | ||
+ | |||
+ | </code> | ||
+ | Gdy np. 70% elementów kontenera zostanie przeliczonych zobaczymy następujący obrazek: | ||
+ | <code> | ||
+ | 0% 10 20 30 40 50 60 70 80 90 100% | ||
+ | |----|----|----|----|----|----|----|----|----|----| | ||
+ | ************************************ | ||
+ | </code> | ||
+ | |