Boost开发指南-1.2progress_display

news/2024/11/25 13:41:13/

Progress_display

progress_display可以在控制台上显示程序的执行进度,如果程序执行很耗费时间,那么它能够提供一个友好的用户界面,不至于让用户在等待中失去耐心。

progress_display位于名字空间boost,为了使用progress_display组件,需要包含头文件<boost/progress.hpp>,即:

#include <boost/progress.hpp>
using namspace boost;

类摘要

progress_display是一个独立的类,与 timer库中的其他两个组件——timer 和progress_timer没有任何联系,它的类摘要如下:

class progress_display : noncopyable
{public:progress_display( unsigned long expected_count );progress_display( unsigned long expected_count_,std::ostream & os,const std::string & s1 = "\n", const std::string & s2 = "",const std::string & s3 = "" );void           restart( unsigned long expected_count );unsigned long  operator+=( unsigned long increment );unsigned long  operator++();unsigned long  count() const;unsigned long  expected_count() const;
};

progress_display的构造函数接受一个long型的参数expected_count,表示用于进度显示的基数,是最常用的创建progress_display的方法。

另一种形式的构造函数除了基数和流输出对象外,还接受三个字符串参数,定义显示的三行首字符串。但这个构造函数有点小问题,流输出对象通常都应该是cout,把进度输出到文件或者其他用户看不到的地方似乎没有多大的意义。

在构造后progress_display对象会显示出一个类似图形化进度条的界面,用两行以字符的形式显示百分比进度,像这样:
在这里插入图片描述
重载的加法操作符operator+=和 operator++用来增加计数,并在第三行用字符*显示进度百分比 count() / expected_count。成员函数count()可以返回当前的计数,当计数到达基数expected_count时表示任务已经完成,进度为100%。

用法

假设我们要把一些存储在std::vector中的字符串以每个一行的形式写入到文本文件中,因为字符串数量很多,而且有的很大,因此可能操作会耗费很多时间。progress_display可以让程序有一个友好的人机界面,让用户知道程序的进度。

使用progress_display首先要调用它的构造函数,传入进度基数,如:

progress_display pd(v.size());

随后就可以使用它重载的加法操作符(++pd)来根据程序的运行情况增加计数,直到完成任务。

#include <iostream>
#include <vector>
using namespace std;// disable pragma warning
#define BOOST_ALLOW_DEPRECATED_HEADERS#include <boost/progress.hpp>
using namespace boost;//void case1()
{vector<string> v(100); //一个字符串向量ofstream fs("./test.txt"); //文件输出流//声明一个progress_display对象,基数是v的大小//progress_display pd(v.size(),cout ,"%%%", "+++", "???");progress_display pd(v.size());//开始迭代遍历向量 处理字符串 写入文件for (auto& x : v)  //for+auto循环{fs << x << endl; //更新进度显示++pd;}
}//void case2()
{vector<string> v(100, "aaa");v[10] = ""; v[23] = "";ofstream fs("./test.txt");progress_display pd(v.size());for (auto pos = v.begin(); pos != v.end(); ++pos)  //使用迭代器遍历容器{fs << *pos << endl;++pd;if (pos->empty()){cout << "null string # "<< (pos - v.begin()) << endl;}}
}//int main()
{case1();case2();
}

在这里插入图片描述
当程序处理了75个字符串时,控制台的显示大概如下:
在这里插入图片描述
如果改用progress_display另一种形式的构造函数,如:

progress_display pd(v.size(),cout ,"%%%", "+++", "???");

那么显示就会变成这样:
在这里插入图片描述
这种输出形式颇有点“画蛇添足”的味道,建议读者最好不要这么用。

注意事项

progress_display可以用作基本的进度显示,但它有个固有的缺陷:无法把进度显示输出与程序的输出分离。

这是因为progress_display和所有c++程序一样,都向标准输出(cout)输出字符,如果使用progress_display的程序也有输出操作,那么progress_display的进度显示就会一片混乱。

仍然使用刚才的写入文本文件的例子,我们希望显示进度的同时还能报告空的字符串的行号,像这样:
在这里插入图片描述
如case2一样,似乎一切都很好,但实际的运行结果却是:
在这里插入图片描述
很显然,for循环中的输出打乱了progress_display的正常输出,而 progress_display对此毫不知情,仍然按部就班地显示着百分比进度。

这个显示混乱的问题很难解决,因为我们无法预知庞大的程序之中哪个地方会存在一个可能会干扰progress_display的输出。一个可能(但远非完美〉的办法是在每次显示进度时都调用restart()重新显示进度刻度,然后用operator+=来指定当前进度,而不是简单地调用operator++,例如:

pd.restart(v.size());
pd += (pos - v.begin() + 1);

http://www.ppmy.cn/news/75127.html

相关文章

软件测试基础(V模型W模型)

软件测试基础 1. 软件测试的生命周期 需求分析&#xff1a;站在用户的角度查看需求逻辑是否正确&#xff0c;是否符合用户的需求和行为习惯。站在开发的角度思考需求是否可以实现&#xff0c;或者说实现起来难度高不高测试计划&#xff1a;指定测试计划&#xff08;包括不限于…

6、Ray的高级功能和扩展性

6、Ray的高级功能和扩展性 导航 1.简介和背景 2.Ray的基本概念和核心组件 3.分布式任务调度和依赖管理 4.对象存储和数据共享 5.Actor模型和并发编程 6.Ray的高级功能和扩展性 7.使用Ray构建分布式应用程序的案例研究 8.Ray社区和资源 9.核心框架介绍 10.扩展1&

【计算机视觉 | 目标检测】术语理解4:OVD 训练的范式、半监督目标检测(SSOD)、弱监督目标检测(WSOD)、 余弦相似度

文章目录 一、OVD&#xff08;开放词汇对象检测&#xff09;训练的范式二、Semi-supervised Object Detection三、Weakly-supervised Object Detection四、余弦相似度 一、OVD&#xff08;开放词汇对象检测&#xff09;训练的范式 在OVD&#xff08;开放词汇对象检测&#xff…

【TES641】基于VU13P FPGA的4路FMC接口基带信号处理平台

板卡概述 TES641是一款基于Virtex UltraScale系列FPGA的高性能4路FMC接口基带信号处理平台&#xff0c;该平台采用1片Xilinx的Virtex UltraScale系列FPGA XCVU13P作为信号实时处理单元&#xff0c;该板卡具有4个FMC子卡接口&#xff08;其中有2个为FMC接口&#xff09;&#xf…

3D CAD模型的体素化

你有没有搜索过如何将 Cad 模型转换为 python 就绪的 numpy 数组&#xff0c;但没有得到任何明确的答案&#xff1f; 我也是。 经过长时间的研究并尝试了很多软件和 python 库&#xff0c;我终于能够将 3D STEP 文件转换为 3 维 numpy 数组。 如果你想做同样的事情或只是想知道…

C++前置声明

在C中&#xff0c;前置声明&#xff08;Forward Declaration&#xff09;是指在使用类、函数或变量之前提前声明它们的存在&#xff0c;而无需提供完整的定义。前置声明可以减少编译时间和减少代码之间的依赖性。 以下是几个常见情况下使用前置声明的示例&#xff1a; 类的前…

听说你想成为一名6的飞起的黑客,这些资料怎么能少

重点提醒&#xff1a;本项目工具来源于互联网&#xff0c;是否含带木马及后门请自行甄别&#xff01;&#xff01;Hvv来即&#xff0c;请大家提高警惕&#xff01;&#xff01;&#xff01; 受限于篇幅原因&#xff0c;无法全部展示&#xff0c;如果你需要的话&#xff0c;可以…

什么是可持续能源?

随着全球经济的不断发展和人口的不断增长&#xff0c;能源问题越来越受到关注。传统能源已经不能满足人们对能源的需求&#xff0c;同时也对环境和健康带来了严重的影响。为了解决这些问题&#xff0c;出现了可持续能源的概念。那么&#xff0c;什么是可持续能源呢&#xff1f;…