通用进度计数器

来源:互联网 发布: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+11) : 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;
};

 

原创粉丝点击