Indicators é um projeto que dispõe código pronto para você implementar ao criar barras de progresso no terminal.
single_include
.Para implementar uma barra de progresso em seu aplicativo, inclua indicators/progress_bar.hpp
e crie um objeto ProgressBar. Esta é a estrutura geral de uma barra de progresso:
{prefix} {start} {fill} {lead} {remaining} {end} {percentage} [{elapsed}<{remaining}] {postfix}
^^^^^^^^^^^^^ Bar Width ^^^^^^^^^^^^^^^
A quantidade de progresso em ProgressBar é mantida como um size_t
no intervalo [0, 100]. Quando o progresso chega a 100, a progressão está concluída.
No código no nível do aplicativo, existem duas maneiras de atualizar esse progresso:
Progresso de atualização usando bar.tick()
#include <indicators/progress_bar.hpp>
#include <thread>
#include <chrono>
int main() {
using namespace indicators;
ProgressBar bar{
option::BarWidth{50},
option::Start{"["},
option::Fill{"="},
option::Lead{">"},
option::Remainder{" "},
option::End{"]"},
option::PostfixText{"Extracting Archive"},
option::ForegroundColor{Color::green},
option::FontStyles{std::vector<FontStyle>{FontStyle::bold}}
};
// Update bar state
while (true) {
bar.tick();
if (bar.is_completed())
break;
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
return 0;
}
Se você tiver uma iso
de por exemplo 5GB e deseja copiar para outro diretório, o código seria;
#include <indicators/indeterminate_progress_bar.hpp>
#include <indicators/cursor_control.hpp>
#include <atomic>
#include <filesystem>
#include <thread>
#include <chrono>
namespace fs = std::filesystem;
int main() {
// Configure an indeterminate progress bar
indicators::IndeterminateProgressBar bar{
indicators::option::BarWidth{40},
indicators::option::Start{"["},
indicators::option::Fill{"·"},
indicators::option::Lead{"<==>"},
indicators::option::End{"]"},
indicators::option::PostfixText{"Copying file..."},
indicators::option::ForegroundColor{indicators::Color::yellow},
indicators::option::FontStyles{
std::vector<indicators::FontStyle>{indicators::FontStyle::bold}}
};
indicators::show_console_cursor(false);
// Setup a file copy job to run in a separate thread
auto copyfile_job = [&bar]() {
const std::string src = "/home/marcos/5GB.iso";
const std::string dst = "/home/marcos/Downloads/5GB.iso";
try {
auto done = fs::copy_file(src, dst, fs::copy_options::overwrite_existing);
if (done) {
std::cout << termcolor::bold << termcolor::green
<< "Copy completed\n" << termcolor::reset;
}
else {
std::cout << termcolor::bold << termcolor::red
<< "Copy failed\n" << termcolor::reset;
}
}
catch (std::exception& e) {
std::cout << e.what() << "\n";
}
// When the job is done, mark the progress bar as completed
bar.mark_as_completed();
};
std::thread copyfile_job_completion_thread(copyfile_job);
// Update bar state and wait for copy to complete
while (!bar.is_completed()) {
bar.tick();
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
copyfile_job_completion_thread.join();
indicators::show_console_cursor(true);
return 0;
}
//
indicators
e compilando seu códigoBasta clonar e usar o CMake Make
igit clone https://github.com/p-ranav/indicators
cd indicators
mkdir build && cd build
cmake -DINDICATORS_SAMPLES=ON -DINDICATORS_DEMO=ON ..
make
cd
vim copia.cpp
g++ -pthread -std=c++17 copia.cpp