linux中实现一个简单的进度条

sky sky     2022-09-07     175

关键词:

转自:http://blog.csdn.net/yuehailin/article/details/53999288

说起进度条,其实大家常常见到,比如说你在下载视频或文件的时候,提示你当前下载进度的就是我们今天要说的进度条,进度条的模拟实现是挺简单的,但是要做的比较实用还是需要注意很多地方的,下来我就一步步的深入分析一下进度条得实现。

1.起初写下了这样的代码,解释以下几点:

    1>首先我们需要将[ ]固定在左右两边,中间预留下空间,然后用“=”进行填充。这里printf("[%-100s] ",str);           格式化输出,‘-’表示左对齐,100表示固定列宽,然后‘ ’ 表示回车,即每次打印完使光标回到最开始位置           再明确一下,‘ ’和‘ ’这两个概念:

       ‘ ’表示换行,换到当前行的下一行,即光标指向下一行最开始的位置;‘ ‘指回车,即光标回到最开始位置。

    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通常是无缓冲的。

 

      printf是一个行缓冲函数,先写到缓冲区,满足条件后,才将缓冲区刷到对应文件中,刷缓冲区的条件如下:
    (1)缓冲区填满;
    (2)写入的字符中有‘ ’ ,‘ ‘;
    (3)调用fflush手动刷新缓冲区;
    (4)调用scanf要从缓冲区中读取数据时,也会将缓冲区内的数据刷新;
    满足上面4个条件之一缓冲区就会刷新
 
下面是代码实现:

技术分享

看一下效果图:

技术分享

 

2.知道了上面按一段一段显示的原因,下面我们就来改进一下它,通过fflush这个函数就可以解决这个问题。

fflush用于清空缓冲流,这样就会立刻输出所有在缓冲区的内容,也就能即时刷新,这样刚好就满足了进度条的实时性。

 

技术分享

下面是效果展示:

技术分享

3.上面基本达到了我们想要的效果,但是还是不好,在你下载文件的时候人家就有一个百分比来提示你下载了多少了,而我们这只有一个进度条,前进了多少还得自己估计,这样多不好啊,所以我们也来实现一下这种方式。

技术分享

效果图:

技术分享

 

4.上面实现的看似都有了该有的效果,但是我们还是会感觉有些欠缺,比如有时候进度条会有停止不前的时候,这个时候我们很难知道程序是在继续运行还是卡住了,下面我通过一种动态旋转的图标对其进行优化。

旋转图标自己可以定,“- | /”或“| / - ”都可以

技术分享

效果图:

技术分享

技术分享

 

5.最后再提一点,我在运行代码时就用了两个命令,make 和./Proc,那是因为我提前就编写了一个Makefile文件,这样就方便了我们运行代码。

下面就来看一下Makefile文件:

技术分享

 

作为一个好习惯,记得每次在执行完./Proc后make clean一下

技术分享

我们如何以编程方式在 Android Q OS 中实现可搜索的进度条?

】我们如何以编程方式在AndroidQOS中实现可搜索的进度条?【英文标题】:HowcanweachieveseekableprogressbarinAndroidQOSprogramatically?【发布时间】:2019-10-2817:59:36【问题描述】:AndroidQBeta2为音乐通知添加了一个可搜索的进度条,那么我们... 查看详情

在linux下写一个简单的进度条,用make指令进行编译。

首先建立一个新的文件,touchprogress_bar.c执行该vimprogress_bar.c命令,写进度条的程序。写进一个进度条程序:#include<stdio.h>#include<unistd.h>#include<string.h>voidprogress(){inti=0;charbar[102];memset(bar,0,102*sizeof 查看详情

如何在service中同步更新通知activity中的进度条

...条和下载控制按钮(暂停,删除等)问题:如何在service中实现notification和activity中进度条的同步更新?(注:不用广播)方法1、使用Handler在Service发送进度消息2、activity中实现一个回调的接口,然后注册到服务里3、用广播参考... 查看详情

linux基础实现一个简单的进度条(代码片段)

文章目录一、预备知识二、简单的倒计时三、实现一、预备知识换行和回车的区别\\r:回车,回到当前行的行首,而不会换到下一行,如果接着输出的话,本行以前的内容会被逐一覆盖,如果之前的内容比... 查看详情

linux操作系统实现一个简单的进度条(代码片段)

文章目录一、预备知识二、简单的倒计时三、实现一、预备知识换行和回车的区别\\r:回车,回到当前行的行首,而不会换到下一行,如果接着输出的话,本行以前的内容会被逐一覆盖,如果之前的内容比... 查看详情

如何在 swift 中实现类似 Dropbox 的进度视图?

】如何在swift中实现类似Dropbox的进度视图?【英文标题】:HowdoIachievethisDropboxlikeprogressviewinswift?【发布时间】:2015-09-1105:46:54【问题描述】:DropboxiOS应用有一种非常酷的视图层次结构,当从它们的“文件”tableView中选择一行时... 查看详情

使用 jQuery 的文件上传进度条

...】:2013-03-0220:39:19【问题描述】:我正在尝试在我的项目中实现AJAX文件上传功能。我为此使用jQuery;我的代码使用AJAX提交数据。我还想实现一个文件上传进度条。我怎样才能做到这一点?有什么方法可以计算已经上传了多少,... 查看详情

使用 jQuery 的文件上传进度条

...】:2013-03-0220:39:19【问题描述】:我正在尝试在我的项目中实现AJAX文件上传功能。我为此使用jQuery;我的代码使用AJAX提交数据。我还想实现一个文件上传进度条。我怎样才能做到这一点?有什么方法可以计算已经上传了多少,... 查看详情

如何只实现一个圆形进度条,直到图像被滑动加载

...一个圆形进度动画,直到从滑行加载图像,但是在占位符中实现动画后,它为每个单独的图像提供动画,并且图像更改为占位符图像大小,我没有想要我希望布局的中心应该只有一个圆 查看详情

在 Flutter 的登录屏幕中显示循环进度对话框,如何在 Flutter 中实现进度对话框?

...在Flutter的登录屏幕中显示循环进度对话框,如何在Flutter中实现进度对话框?【英文标题】:ShowCircularProgressDialoginLoginScreeninFlutter,howtoimplementprogressdialoginflutter?【发布时间】:2018-12-2703:41:51【问题描述】:我有一个登录表单,其... 查看详情

尝试在 React Native 中实现 AsyncStorage 时遇到问题

】尝试在ReactNative中实现AsyncStorage时遇到问题【英文标题】:HavingtroubletryingtoimplementAsyncStorageinReactNative【发布时间】:2015-07-2817:07:20【问题描述】:我正在使用reactnative来构建应用程序,我遇到的唯一问题是我有一个进度条来跟... 查看详情

为基于 flex 框的进度条设置动画时出现一个奇怪的故障

】为基于flex框的进度条设置动画时出现一个奇怪的故障【英文标题】:Abizarreglitchwhenanimatingaflexbox-basedprogressbar【发布时间】:2019-09-1002:53:43【问题描述】:我正在尝试通过实现进度条来学习flexbox。一切正常,直到我尝试用jquery... 查看详情

androidapp开发音量调节中实现拖动条和滑动条和音频管理器audiomanager讲解及实战(超详细附源码和演示视频)(代码片段)

需要源码请点赞关注收藏后评论区留下QQ~~~一、拖动条和滑动条拖动条SeekBar继承自进度条ProgressBar,它与进度条的不同之处在于,进度条只能在代码中修改进度值,不能由用户改变进度值,拖动条不仅可以在代码... 查看详情

在 TypeScript 1.8 中实现一个简单的字典

】在TypeScript1.8中实现一个简单的字典【英文标题】:ImplementingasimpleDictionaryinTypeScript1.8【发布时间】:2016-09-1801:10:41【问题描述】:我正在尝试找到一种在TypeScript1.8中实现Dictionary的简单方法。网上有几种实现建议,但最吸引人... 查看详情

delphixeandroid更改progressbar1进度条颜色

下面是安卓学习手册中实现各种进度条的截图:要想看各种进度条的实现代码和文档,直接去360手机助手中下载安卓学习手册,例子文档随便看。1、说明  在某些操作的进度中的可视指示器,为用户呈现操作的进度,还它有... 查看详情

尝试在 Reactjs 中实现一个简单的承诺

】尝试在Reactjs中实现一个简单的承诺【英文标题】:TryingtoimplementaSIMPLEpromiseinReactjs【发布时间】:2017-02-2302:25:30【问题描述】:刚刚在React中首次尝试Promises。我有一个基本的承诺(从别人的代码中提取),但不知道如何使它变... 查看详情

android怎么自定义绘制如下图中这种进度条

下面是安卓学习手册中实现各种进度条的截图:要想看各种进度条的实现代码和文档,直接去360手机助手中下载安卓学习手册,例子文档随便看。1、说明  在某些操作的进度中的可视指示器,为用户呈现操作的进度,还它有... 查看详情

asp.net的一个简单进度条功能(代码片段)

...完成后,进度条消失,其实也是比较简单的了。我们需要一个进度条代码文件ProgressBar.htm(注意:是没有head这些标签的) <scriptlanguage="javascript">functionSetPorgressBar(pos)//设置进度条居中varscreenWidth=document.body.of 查看详情