通用进度计数器
来源:互联网 发布:volatile java的使用 编辑:程序博客网 时间:2024/05/06 05:46
通用进度计数器
在最近设计的分布式程序中,涉及到了计算异步登陆进度百分比,以便能在UI上面显示。一开始的设计是程序走到一定的步骤就给进度变量设置一个数值,可是随着步骤越来越多复杂,我感到有必要设计一个自动化的进度计算小工具。
首先拟定了一个进度计算模型:一个过程分为许多阶段(stage),每个阶段又分为许多步骤(step),进度百分比定义为已经走过的步骤数与步骤总数的比值。
有了这个模型,代码就很easy了(C++):
//功能:进度计数器
//模型:将一个过程分为n个阶段(stage),每个阶段再分为一些步骤(step)
//计算:将一个指定的(stage,step)计算为整个过程的百分比
//用法:构造时提供阶段数n以及每个阶段的步骤数量(int数组)
class progress_counter
{
public:
progress_counter(const int* steps, int n)
{
int i;
m_n=n;
m_steps=steps;
m_accumulated=new int[n];
m_accumulated[0]=steps[0];
for (i=1; i<n; ++i) m_accumulated[i]=m_accumulated[i-1]+steps[i];
m_stage=m_step=m_progress=0;
}
~progress_counter()
{
delete [] m_accumulated;
}
int set(int stage, int step=1)
{
assert(stage<m_n);
assert(step<=m_steps[stage]);
m_stage=stage; m_step=step;
m_progress = (m_accumulated[stage]+step)*100 / m_accumulated[m_n-1];
return m_progress;
}
int get() {return m_progress;}
operator int() {return get();}
int max_step_in_stage() {return m_steps[m_stage];}
int go_one_step() {return (m_step<m_steps[m_stage]) ? set(m_stage, m_step+1) : get();}
int go_one_stage() {return (m_step<m_n-1) ? set(m_stage+1, 1) : get();}
int finish() {m_stage=m_n; m_step=m_steps[m_n]; return 100;}
private:
const int* m_steps;
int* m_accumulated;
int m_n, m_stage, m_step, m_progress;
};
//模型:将一个过程分为n个阶段(stage),每个阶段再分为一些步骤(step)
//计算:将一个指定的(stage,step)计算为整个过程的百分比
//用法:构造时提供阶段数n以及每个阶段的步骤数量(int数组)
class progress_counter
{
public:
progress_counter(const int* steps, int n)
{
int i;
m_n=n;
m_steps=steps;
m_accumulated=new int[n];
m_accumulated[0]=steps[0];
for (i=1; i<n; ++i) m_accumulated[i]=m_accumulated[i-1]+steps[i];
m_stage=m_step=m_progress=0;
}
~progress_counter()
{
delete [] m_accumulated;
}
int set(int stage, int step=1)
{
assert(stage<m_n);
assert(step<=m_steps[stage]);
m_stage=stage; m_step=step;
m_progress = (m_accumulated[stage]+step)*100 / m_accumulated[m_n-1];
return m_progress;
}
int get() {return m_progress;}
operator int() {return get();}
int max_step_in_stage() {return m_steps[m_stage];}
int go_one_step() {return (m_step<m_steps[m_stage]) ? set(m_stage, m_step+1) : get();}
int go_one_stage() {return (m_step<m_n-1) ? set(m_stage+1, 1) : get();}
int finish() {m_stage=m_n; m_step=m_steps[m_n]; return 100;}
private:
const int* m_steps;
int* m_accumulated;
int m_n, m_stage, m_step, m_progress;
};
- 通用进度计数器
- TIM通用定时器(一)计数器模式
- stm32的通用计数器用于编码器的脉冲计数
- stm32通用定时器用做外部脉冲计数器的例程
- [D-IX] 2(通用)计数器s 2标志线
- 计数器
- 计数器
- 计数器
- 计数器
- 计数器
- 计数器
- 计数器
- 计数器
- 计数器
- 计数器
- 计数器
- 计数器
- 计数器
- 偶过
- window.showModalDialog以及window.open用法简介
- 在.NET中基于Windows消息的IPC实现
- Zend系列产品的php.ini配置
- 一些验证方面的资料
- 通用进度计数器
- 一个javascript脚本库
- 跟“无为”学习Ajax技术第八天
- 让.NET Remoting更快些-IPCChannel的实现
- IE和FireFox中层的拖动详解。
- AspNetPager分页控件
- Johnny Deng 语录 1
- ASP.NET中导出excel/word等类型文件的简单方法
- 得到select中options的值,隐藏div的js代码