Linux中实现一个简单的进度条【转】
转自:http://blog.csdn.net/yuehailin/article/details/53999288
说起进度条,其实大家常常见到,比如说你在下载视频或文件的时候,提示你当前下载进度的就是我们今天要说的进度条,进度条的模拟实现是挺简单的,但是要做的比较实用还是需要注意很多地方的,下来我就一步步的深入分析一下进度条得实现。
1.起初写下了这样的代码,解释以下几点:
1>首先我们需要将[ ]固定在左右两边,中间预留下空间,然后用“=”进行填充。这里printf("[%-100s]\r",str); 格式化输出,‘-’表示左对齐,100表示固定列宽,然后‘\r’ 表示回车,即每次打印完使光标回到最开始位置 再明确一下,‘\n’和‘\r’这两个概念:
‘\n’表示换行,换到当前行的下一行,即光标指向下一行最开始的位置;'\r'指回车,即光标回到最开始位置。
2>如果不加睡眠时间,结果一下就全打印出来了,但我们想让它稍微慢一点,毕竟是进度条嘛,而Linux系 统下默认sleep时间单位为秒(s),这样的话又觉得间隔时间太长了,于是就有了usleep,它是以微妙计的, 其头文件在#include <unistd.h>下,这些信息不明白了就man一下;
3>如下代码我们在观察现象时会发现是隔0.1s在显示,但是它却是一段一段显示的,这就让人很是郁闷了, 最后才发现是printf的原因,printf是先将要输出的内容写到缓冲区里,然后再刷新。
首先介绍一下UNIX里面关于标准IO的几种缓冲机制:
<3.1>全缓冲 ,全缓冲指的是系统在填满标准IO缓冲区之后才进行实际的IO操作;注意,对于驻留在磁盘上的文件来说通常是由标准IO库实 施全缓冲。
<3.2>行缓冲,在这种情况下,标准IO在输入和输出中遇到换行符时执行IO操作;注意,当流涉及终端的时候,通常使用的是行缓冲。
<3.3>无缓冲,无缓冲指的是标准IO库不对字符进行缓冲存储;注意,标准出错流stderr通常是无缓冲的。
(1)缓冲区填满;
(2)写入的字符中有‘\n’ ,'\r';
(3)调用fflush手动刷新缓冲区;
(4)调用scanf要从缓冲区中读取数据时,也会将缓冲区内的数据刷新;
满足上面4个条件之一缓冲区就会刷新
看一下效果图:
2.知道了上面按一段一段显示的原因,下面我们就来改进一下它,通过fflush这个函数就可以解决这个问题。
fflush用于清空缓冲流,这样就会立刻输出所有在缓冲区的内容,也就能即时刷新,这样刚好就满足了进度条的实时性。
下面是效果展示:
3.上面基本达到了我们想要的效果,但是还是不好,在你下载文件的时候人家就有一个百分比来提示你下载了多少了,而我们这只有一个进度条,前进了多少还得自己估计,这样多不好啊,所以我们也来实现一下这种方式。
效果图:
4.上面实现的看似都有了该有的效果,但是我们还是会感觉有些欠缺,比如有时候进度条会有停止不前的时候,这个时候我们很难知道程序是在继续运行还是卡住了,下面我通过一种动态旋转的图标对其进行优化。
旋转图标自己可以定,“- \ \ | /”或“| / - \ \”都可以
效果图:
5.最后再提一点,我在运行代码时就用了两个命令,make 和./Proc,那是因为我提前就编写了一个Makefile文件,这样就方便了我们运行代码。
下面就来看一下Makefile文件:
作为一个好习惯,记得每次在执行完./Proc后make clean一下
Linux中实现一个简单的进度条【转】的更多相关文章
- python中实现一个简单的进度条
import time def progress(n,a): m = int(n / a * 100) x = int(n / a * 10) time.sleep(0.2) #只是为了让进度条明显 ...
- Python——一个简单的进度条的实现
import math def process_bar(total_work,work_index,length): times = total_work / length # 长度倍数,用来缩放或扩 ...
- 让android系统中任意一个view变成进度条
1.效果 2.进度条背景drawable文件 结束后可以恢复原背景. <?xml version="1.0" encoding="utf-8"?> ...
- svg-写一个简单的进度条
html <div class="container"> <div class="line-wrap"> <svg version ...
- iOS开发:代码通用性以及其规范 第二篇(猜想iOS中实现TableView内部设计思路(附代码),以类似的思想实现一个通用的进度条)
在iOS开发中,经常是要用到UITableView的,我曾经思考过这样一个问题,为什么任何种类的model放到TableView和所需的cell里面,都可以正常显示?而我自己写的很多view却只是能放 ...
- Linux shell 下简单的进度条实现
Linux shell 下简单的进度条实现 [root@db145 ~]# cat print_process.sh function Proceess(){ spa='' i= ] do print ...
- Linux中搭建一个ftp服务器详解
来源:Linux社区 作者:luzhi1024 详解Linux中搭建一个ftp服务器. ftp工作是会启动两个通道:控制通道 , 数据通道在ftp协议中,控制连接均是由客户端发起的,而数据连接有两种 ...
- 使用原生JS+CSS或HTML5实现简单的进度条和滑动条效果(精问)
使用原生JS+CSS或HTML5实现简单的进度条和滑动条效果(精问) 一.总结 一句话总结:进度条动画效果用animation,自动效果用setIntelval 二.使用原生JS+CSS或HTML5实 ...
- 在ubuntu linux 中编写一个自己的python脚本
在ubuntu linux 中编写一个自己的简单的bash脚本. 实现功能:终端中输入简单的命令(以pmpy为例(play music python),为了区别之前说的bash脚本添加了py后缀),来 ...
随机推荐
- 修改有数据oracle字段类型 从number转为varchar
--修改有数据oracle字段类型 从number转为varchar--例:修改ta_sp_org_invoice表中RESCUE_PHONE字段类型,从number转为varchar --step1 ...
- lua优化
前言 Lua是一门以其性能著称的脚本语言,被广泛应用在很多方面,尤其是游戏.像<魔兽世界>的插件,手机游戏<大掌门><神曲><迷失之地>等都是用Lua来 ...
- Java中大数的使用与Java入门(NCPC-Intergalactic Bidding)
引入 前几天参加湖南多校的比赛,其中有这样一道题,需要使用高精度,同时需要排序,如果用c++实现的话,重载运算符很麻烦,于是直接学习了一发怎样用Java写大数,同时也算是学习Java基本常识了 题目 ...
- ubuntu中tensorflow安装
首先加入了CUDA_HOM环境变量,然后下载了一个分析工具库,结果E: 无法定位软件包 libcupti-dev,在etc/apt 的sources.list 添加镜像源 deb http://arc ...
- NO4——并查集
int find(int x) { int r = x; while(father[r]!=r) r = father[r]; return r; } /* int find(int x) { if( ...
- hadoop worldcount小程序
首先在hadoop中建立input文件夹放几个文件,里边写点东西.比如我放了三个,分别写的是 第一个 hello hadoop bye hadoop 第二个 hello world bye world ...
- HDU G-免费馅饼
http://acm.hdu.edu.cn/showproblem.php?pid=1176 Problem Description 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然 ...
- linux服务器su之后变成bash-4.1#
当前为root权限 cd /home/jboss 执行如下命令,将缺失的配置文件拷贝到指定位置即可 cp ./.bashrc /root cp ./.bash_profile /root 然后切换账号 ...
- 《SQL入门经典》总结
<SQL入门经典>这本书从考试前就开了个头,一直到前两天才看完,拉的战线也够长的.放假来了,基本上什么内容都不记得了.好不容易看完了,就赶紧总结一下吧! 该书分为两大部分,第一部分是第1~ ...
- 在虚拟机安装 Linux 系统(菜鸡级别)
处理器数量看个人 剩下按照推荐的配置选择就OK 启动客户端 -> Enter进入 /为其它盘./Boot为根目录 可不勾选