diff --git a/README.md b/README.md index 46d748f..c5031ec 100644 --- a/README.md +++ b/README.md @@ -297,6 +297,104 @@ int main() { } ``` +# MultiProgress + +`indicators` supports management of multiple progress bars using the `MultiProgress` class. + +

+ +

+ +`MultiProgress` is a template class that holds references to progress bars and provides a safe interface to update the state of multiple bars. `MultiProgress` works with both `ProgressBar` and `BlockProgressBar`. + +```cpp +#include +#include + +int main() { + + indicators::ProgressBar bar1; + bar1.set_bar_width(50); + bar1.start_bar_with("["); + bar1.fill_bar_progress_with("■"); + bar1.lead_bar_progress_with("■"); + bar1.fill_bar_remainder_with(" "); + bar1.end_bar_with(" ]"); + bar1.set_foreground_color(indicators::Color::YELLOW); + bar1.show_elapsed_time(); + bar1.show_remaining_time(); + bar1.set_prefix_text("Progress Bar #1 "); + + indicators::ProgressBar bar2; + bar2.set_bar_width(50); + bar2.start_bar_with("["); + bar2.fill_bar_progress_with("="); + bar2.lead_bar_progress_with(">"); + bar2.fill_bar_remainder_with(" "); + bar2.end_bar_with(" ]"); + bar2.set_foreground_color(indicators::Color::CYAN); + bar2.show_elapsed_time(); + bar2.show_remaining_time(); + bar2.set_prefix_text("Progress Bar #2 "); + + indicators::ProgressBar bar3; + bar3.set_bar_width(50); + bar3.start_bar_with("["); + bar3.fill_bar_progress_with("#"); + bar3.lead_bar_progress_with("#"); + bar3.fill_bar_remainder_with(" "); + bar3.end_bar_with(" ]"); + bar3.set_foreground_color(indicators::Color::RED); + bar3.show_elapsed_time(); + bar3.show_remaining_time(); + bar3.set_prefix_text("Progress Bar #3 "); + + indicators::MultiProgress bars; + bars.add_progress_bar(bar1); + bars.add_progress_bar(bar2); + bars.add_progress_bar(bar3); + + std::cout << "Multiple Progress Bars:\n"; + + auto job1 = [&bars]() { + while (true) { + bars.tick<0>(); + if (bars.is_completed<0>()) + break; + std::this_thread::sleep_for(std::chrono::milliseconds(100)); + } + }; + + auto job2 = [&bars]() { + while (true) { + bars.tick<1>(); + if (bars.is_completed<1>()) + break; + std::this_thread::sleep_for(std::chrono::milliseconds(200)); + } + }; + + auto job3 = [&bars]() { + while (true) { + bars.tick<2>(); + if (bars.is_completed<2>()) + break; + std::this_thread::sleep_for(std::chrono::milliseconds(60)); + } + }; + + std::thread first_job(job1); + std::thread second_job(job2); + std::thread third_job(job3); + + first_job.join(); + second_job.join(); + third_job.join(); + + return 0; +} +``` + # Progress Spinner To introduce a progress spinner in your application, include `indicators/progress_spinner.hpp` and create a `ProgressSpinner` object.