这段 MATLAB 代码定义了一个名为 CmdLineProgressBar
的类,用于在命令行中显示进度条和相关信息(如剩余时间、预计完成时间等)。以下是代码的详细解释:
类的功能
-
显示进度:在命令行中实时更新任务的进度。
-
显示额外信息:
-
ETA(预计完成时间):任务预计完成的时间。
-
剩余时间:任务剩余的预计时间。
-
运行时间:任务已经运行的时间。
-
-
支持单调计数:假设任务的计数是单调递增的(即从 1 到总数)。
类的属性
-
last_msg_len
:-
用于存储上一次打印的信息的长度,以便在更新进度时清除上一次的输出。
-
-
startTime
:-
任务的开始时间,用于计算运行时间、剩余时间和 ETA。
-
类的方法
1. 构造函数 CmdLineProgressBar
-
功能:初始化进度条并显示初始消息。
-
输入参数:
-
msg
:初始消息(字符串),例如'Doing stuff...'
。 -
startTime
(可选):任务的开始时间(datetime
类型)。如果未提供,则不显示时间相关信息。
-
-
实现:
-
打印初始消息。
-
如果提供了
startTime
,则将其存储在obj.startTime
中。
-
2. print
方法
-
功能:更新进度条并显示相关信息。
-
输入参数:
-
n
:当前进度(整数)。 -
tot
:总进度(整数)。
-
-
实现:
-
清除上一次打印的信息(通过退格符
\b
实现)。 -
如果提供了
startTime
且n > 0
,则计算以下信息:-
剩余时间:根据当前进度和总进度计算。
-
ETA:根据剩余时间和当前时间计算。
-
运行时间:从
startTime
到当前时间的差值。
-
-
将进度信息和时间信息格式化为字符串
info_str
。 -
打印
info_str
。 -
如果当前进度
n
等于总进度tot
,则换行(表示任务完成)。 -
更新
last_msg_len
为当前信息字符串的长度。
-
3. 析构函数 delete
-
功能:在对象销毁时换行,确保命令行输出整洁。
-
实现:
-
打印换行符
\n
。
-
代码示例
以下是一个使用 CmdLineProgressBar
的示例:
% 创建进度条对象 pb = CmdLineProgressBar('Processing...', datetime('now')); % 模拟任务 tot = 100; % 总进度 for k = 1 : tot pause(0.1); % 模拟任务处理时间 pb.print(k, tot); % 更新进度条 end
输出示例:
Processing...50/100; ETA: 2023-10-15 12:00:00; time left: 00:00:05; running time: 00:00:05
代码的关键点
-
清除上一次输出:
-
使用退格符
\b
清除上一次打印的信息,确保进度条在同一行更新。
-
-
时间计算:
-
剩余时间:根据当前进度和总进度计算。
-
ETA:根据剩余时间和当前时间计算。
-
运行时间:从
startTime
到当前时间的差值。
-
-
格式化输出:
-
使用
sprintf
将进度信息和时间信息格式化为字符串。
-
-
任务完成处理:
-
当
n == tot
时,打印换行符,表示任务完成。
-
代码的改进建议
-
支持非单调计数:
-
当前代码假设任务的计数是单调递增的。如果需要支持非单调计数(例如进度可能回退),可以修改
print
方法。
-
-
自定义时间格式:
-
允许用户自定义时间格式(例如只显示小时和分钟)。
-
-
多任务支持:
-
扩展类以支持多个任务的进度条显示。
-
-
错误处理:
-
添加对输入参数的验证,例如确保
n
和tot
是正整数,且n <= tot
。
-
总结
CmdLineProgressBar
是一个实用的 MATLAB 类,用于在命令行中显示任务进度和相关时间信息。它通过动态更新命令行输出,提供了清晰的任务进度反馈,适用于需要长时间运行的任务。