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<stdlib.h>

#include<time.h>

// .....

// 刷新随机数的种子

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

// 产生随机数

int sec = rand() % 1000;

// 休眠

Sleep(sec);

  1. 页面显示改进

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

#include<windows.h>

// ......

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

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

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

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

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

总代码

#include<stdio.h>

#include<stdlib.h>

#include<time.h>

#include<windows.h>

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;

}

演示效果

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式小镇做题家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值