博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
项目中进度条实现臆想
阅读量:4876 次
发布时间:2019-06-11

本文共 1324 字,大约阅读时间需要 4 分钟。

关于进度条的实现,主要把握点就是动态修改,且是行内缓冲更新。

关于这点就需要了解printf()的行缓冲问题了

可以做如下验证

#include 
#include
int main(){ // printf("test"); case1:3秒后输出 printf("test\n"); //case2:立即输出 sleep(3); return 0;}

两个case的区别就在于\n了,所以问题的症结之处就是\n了.

printf是一个行缓冲函数,先写到缓冲区,满足条件后,才将缓冲区刷到对应文件中,刷缓冲区的条件如下:

  1 缓冲区填满。
  2 写入的字符中有‘\n’, '\r'。
  3 调用fflush手动刷新缓冲区。
  4 调用scanf要从缓冲区中读取数据时,也会将缓冲区内的数据刷新。
  满足上面4个条件之一缓冲区就会刷新,也就是printf会真正调用write来写入。
  当我们执行printf的进程或者线程结束的时候会主动调用flush来刷新缓冲区,所以程序结束,也会刷新。

对于以上几点,都是很容易进行验证的,这里就不分开谈论了

关于进度条。

有了行缓冲问题的了解,那么我们就可以把握主更新缓冲的时机以及方式了。

  进度条前进时更新缓冲重新写入,方法的话就是\r了。因为我们的进度条是行 行为了

代码实现

#include 
#include
void proc(){ int rate = 0; char bar[102]; memset(bar,'\0',sizeof(bar)); const char * flag = "|/-\\"; while(rate <= 100) { bar[rate] = '='; printf("[%-101s][%%%d][%c]\r",bar,rate,flag[rate%4]); fflush(stdout); rate ++; sleep(1); }}int main(){ proc(); return 0;}

  关于这个进度条问题,只是一个简单的行缓冲了解以及简短项目体验而已。而实际项目中的进度条并非如此的。

个人的理解,揣摩:::因为实际程序中的进度条是需要切合工具,具体功能进度实现的。所以进度条的实现并不是一个时间轴上的有效动作。

比如文件压缩,对于这个过程中的几个点有相对的把控,然后以进度条作为一个伴随进程,利用进程间关系(或者说观察者模式),程序进行一步,报告给进度条程序前进一步。

做到真正的进度把握。

再比如网络文件下载,首先:你可以确定读取文件的准确大小,这时,就是根据网络传输速率,文件传输比例进行更新跟进进度条程序。

 

转载于:https://www.cnblogs.com/lang5230/p/5557721.html

你可能感兴趣的文章
bzoj 3522 [Poi2014]Hotel 树形dp
查看>>
Deepin-安装laravel
查看>>
Linux 系统启动过程
查看>>
华为机试之广度优先遍历
查看>>
IE内核浏览器localStorage的一个大坑
查看>>
洛谷P4551最长异或路径(Trie树)
查看>>
Linux服务器iops性能测试-iozone
查看>>
C# 切图
查看>>
LeetCode 169. Majority Element解题方法
查看>>
python面试题
查看>>
PHP 设计模式 笔记与总结(5)PHP 魔术方法的使用
查看>>
URAL 1934 spfa算法
查看>>
hdu 4288 Coder (成都赛区 线段树)
查看>>
利用multiprocessing.managers开发跨进程生产者消费者模型
查看>>
P1002 过河卒 【递推、简单动规】
查看>>
java工厂模式(转)
查看>>
Linux——Centos 7 账户管理命令(用户篇)useradd usermod userdel
查看>>
Tips:getroproperty调试可以通过,但是运行不可以
查看>>
堆排序
查看>>
动画类的全部方法..
查看>>