• C语言static关键字实现执行进度显示demo


    案例介绍

    我们在安装软件或者远程拉取代码时,通常回看安装进度显示,例如:

    今天给大家分享一个C语言使用static实现执行进度显示的小demo.

    知识点及练习重点

    1、static关键字修饰局部变量的作用

    2、windows平台下休眠函数Sleep使用

    3、随机数函数使用

    4、windows平台下的光标隐藏

    实现想法

    进度显示一般跟时间有关,隔一段时间刷新一下页面数据显示,可以使用Sleep函数实现时间间隔。

    页面数据显示逻辑可以封装成一个函数,隔一段时间调用一下

    执行进度值可以放在函数内部,每执行一次函数进行+1操作,并且具有累加效果,因此该变量必须使用static修饰。(static修饰的局部变量只能初始化一次)。

    实现思路与过程

    1. 封装进度显示函数,并将是否结束结果返回。(进度从0到100,返回值:结束返回1,进行中返回0)

    int progress(){

    static int step = 0;

    printf("任务进行中,当前进度为:%d%%",step++);

    return step > 100;

    }

    注意:C语言输出%使用%%。

    1. 主函数中调用执行进度逻辑

    while(1){

    int over = progress();

    if(over)

    {

    break;

    }

    }

    printf("\n");

    printf("传输完成!.....");

    当progress返回1,则执行结束。

    执行代码会发现一下就完成了从0到100的变化,直接就传输完成了,为了看到逐渐变化的效果,加入windows的Sleep函数,隔一段时间在调用pregress函数。

    1. 加入休眠函数

    Sleep(100);

    Sleep函数为windows下的休眠函数,参数为间隔时间,单位为毫秒。

    运行发现:所有的输出全部显示在页面上面了,进度看起来并不清晰。

    加入清屏函数解决这一问题

    1. 加入清屏函数

    该函数为windows下的清屏函数。

    system("cls");

    进度的变化是均匀变化的,不符合显示逻辑。加入随机数修改时间间隔。

    1. 加入随机时间

    想要进度变化看起来随机,只需要修改每次调用progress的间隔时间即可。

    Sleep的参数为毫秒,每次随机产生一个0~1000内的随机数作为间隔时间。

    #include

    #include

    // .....

    // 刷新随机数的种子

    srand((unsigned int)time(NULL));

    // 产生随机数

    int sec = rand() % 1000;

    // 休眠

    Sleep(sec);

    1. 页面显示改进

    页面在显示进度的时候会有光标在闪烁,可以使用windows平台下的隐藏光标方式将其隐藏起来。

    #include

    // ......

        CONSOLE_CURSOR_INFO curInfo; //定义光标信息的结构体变量

    curInfo.dwSize = 1;  //如果没赋值的话,隐藏光标无效

    curInfo.bVisible = FALSE; //将光标设置为不可见

    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); //获取控制台句柄

    SetConsoleCursorInfo(handle, &curInfo); //设置光标信息

    总代码

    #include

    #include

    #include

    #include

    int progress(){

    static int step = 0;

    printf("任务进行中,当前进度为:%d%%",step++);

    return step > 100;

    }

    int main()

    {

    CONSOLE_CURSOR_INFO curInfo; //定义光标信息的结构体变量

    curInfo.dwSize = 1;  //如果没赋值的话,隐藏光标无效

    curInfo.bVisible = FALSE; //将光标设置为不可见

    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); //获取控制台句柄

    SetConsoleCursorInfo(handle, &curInfo); //设置光标信息

    srand((unsigned int)time(NULL));

    while(1){

    int over = progress();

    if(over)

    {

    break;

    }

    int sec = rand() % 1000;

    Sleep(sec);

    system("cls");

    }

    printf("\n");

    printf("传输完成!.....");

    return 0;

    }

    演示效果

     

     

  • 相关阅读:
    企业在混合办公模式下无缝网络连接搭建秘籍
    PHP功能实现小练习题
    JTS-通过Coordinate点截断几何Geometry
    [PR] LRTA* 搜索算法
    题目:Java 程序员的 10 道 XML 面试题
    3D 三角形的顶点顺序
    Docker下载Tomcat镜像并运行Tomcat容器
    阿里云主机遭受DDOS攻击IP不能使用如何更换弹性公网IP
    js创建与使用对象、json的解析
    pg分组过滤
  • 原文地址:https://blog.csdn.net/amyliyanice/article/details/127790477