barkeep:异步显示动画、计数器和进度条
项目介绍
barkeep 是一个极小的、仅包含单个 C++ 头文件的库,用于在终端异步显示动画、计数器和进度条。它通过包含 barkeep.h
文件即可被项目使用。barkeep 致力于实现非侵入式设计,同时提供了 Python 绑定。
项目技术分析
barkeep 的技术架构非常简洁,它通过单个头文件提供了丰富的功能。这个库的设计理念是尽可能减少对现有项目的侵入性,同时提供易于使用的接口。以下是该项目的一些技术亮点:
- 单一头文件:barkeep 采用单头文件设计,这意味着你只需要将
barkeep.h
包含到你的项目中,即可使用所有功能。 - 异步显示:它支持异步显示动画、计数器和进度条,而不会阻塞主线程。
- 非侵入式设计:barkeep 的设计尽量减少对原有代码的修改,使其易于集成到现有项目中。
- Python 绑定:除了 C++ 之外,barkeep 还提供了 Python 绑定,使得 Python 项目也可以使用这些功能。
项目及技术应用场景
barkeep 的应用场景非常广泛,以下是一些典型的使用案例:
-
等待动画:在执行长时间操作时,显示一个等待动画,提高用户体验。
using namespace std::chrono_literals; namespace bk = barkeep; auto anim = bk::Animation({.message = "Working"}); /* do work */ std::this_thread::sleep_for(10s); anim->done();
-
下载进度条:在下载文件或执行其他需要监视进度的操作时,显示进度条。
auto anim = bk::Animation({.message = "Downloading...", .style = bk::Earth});
-
读取行数计数器:在读取文件或处理数据时,显示已读取的行数。
int work{0}; auto c = bk::Counter(&work, { .message = "Reading lines", .speed = 1., .speed_unit = "line/s" }); for (int i = 0; i < 505; i++) { std::this_thread::sleep_for(13ms); // read & process line work++; } c->done();
-
进度条监控变量:在处理需要监控进度的变量时,使用进度条。
int work{0}; auto bar = bk::ProgressBar(&work, { .total = 505, .message = "Reading lines", .speed = 1., .speed_unit = "line/s", }); for (int i = 0; i < 505; i++) { std::this_thread::sleep_for(13ms); // read & process line work++; } bar->done();
-
自动迭代容器:在遍历容器时自动显示进度条。
std::vector<float> v(300, 0); std::iota(v.begin(), v.end(), 1); // 1, 2, 3, ..., 300 float sum = 0; for (auto x : bk::IterableBar(v, {.message = "Summing", .interval = .02})) { std::this_thread::sleep_for(1.s/x); sum += x; } std::cout << "Sum: " << sum << std::endl;
-
函数监控进度:使用函数(如 lambda)来监控进度。
unsigned long total_area = 10000; unsigned long width = 0, height = 0; auto bar = bk::ProgressBar([&] { return width * height; }, { .total = total_area, .message = "Sweeping area", .speed = 1., }); while (width < 100 and height < 100) { std::this_thread::sleep_for(70ms); if (width < 100) { width++; } if (height < 100) { height++; } }
-
组合显示:使用
|
运算符组合多个显示组件。std::atomic<size_t> sents{0}, toks{0}; auto bar = bk::ProgressBar(&sents, { .total = 1010, .message = "Sents", .show = false}) | bk::Counter(&toks, { .message = "Toks", .speed = 1., .speed_unit = "tok/s", .show = false}); bar->show(); for (int i = 0; i < 1010; i++) { // do work std::this_thread::sleep_for(13ms); sents++; toks += (1 + rand() % 5); } bar->done();
这些应用场景展示了 barkeep 的灵活性和广泛的使用范围,无论是对于简单的等待动画还是复杂的进度监控,barkeep 都能提供有效的解决方案。
项目特点
barkeep 项目的特点如下:
- 轻量级:仅包含单个头文件,易于集成和使用。
- 非侵入式:设计上尽量减少对现有代码的修改。
- 多语言支持:除了 C++,还提供了 Python 绑定。
- 功能丰富:支持异步动画、计数器和进度条显示。
- 易于定制:提供了多种样式和配置选项,满足不同需求。
- 高性能:异步显示和高效的数据处理确保了高性能。
barkeep 作为一个开源项目,不仅提供了强大的功能,还具有良好的设计和易用性,使其成为各种项目中的理想选择。无论你是需要为终端应用程序添加进度条,还是希望在数据处理过程中提供实时反馈,barkeep 都能帮助你轻松实现。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考