首先呢,我给出代码和进度条效果图,后面来进行详解。
如上图所示,这进度条实现的也着实简单(略显尴尬),但进度条原理本质就是如此,只不过多了些修饰,下面来进行详解。
unistd.h是C、C++程序设计语言中提供对POSIX(可移植操作系统接口)操作系统API的访问功能的头文件的名称。
usleep函数是延时函数,单位为微秒。下面看个有趣的现象
看上面这段简单的代码,他实现的效果是先延迟三秒,然后屏幕显示“hello”。
再看这段代码,它的实现效果是屏幕先展示“hello”,然后延迟三秒再结束。不就多了个“\n”麽,咋结果不同呢?
这其中就涉及一个重要问题:缓冲机制。为了提高文件系统性能,内核利用一部分物理内存分配出缓冲区,用于缓冲系统操作和数据文件,当内核收到读写的请求时,内核先去缓冲区找是否有请求的数据,有就直接返回,如果没有则通过驱动程序直接操作磁盘。缓冲机制减少了系统调用次数,降低了CPU上下文切换和磁盘访问频率。
缓冲区分为无缓冲,行缓冲(按行刷新“\n”,显示器就是行缓冲),全缓冲(写满再刷新)。绝大多数流是完全缓冲的,这意味着读取和写入实际上是从一块被称为缓冲区的内存区域来回复制数据。从内存中来回复制数据是非常快速的。用于输出流的缓冲区只有当写满时才会被刷新(flush,物理输入)到设备或文件中。类似,输入缓冲区当它为空时通过从设备或文件读取下一块较大的输入,重新填充缓冲区。
而printf函数存在行缓冲机制,先把数据放入缓冲区然后再显示到屏幕上,如果加上“\n”就会立即显示在屏幕上,没有“\n”则先把数据放在缓冲区再缓停3秒显示在屏幕上。还有同种效果的一种方法是在printf函数后面立即调用fflush(stdout);fflush迫使缓冲区的数据立即写入,不管它是否已满。
你也可以对你的进度条进行修饰,如下图:
还有更漂亮的:
这个我能力有限,还未吃透,所以放这里仅供参考。这些是在bash中的。那个带底色的进度条就是根据这段代码改造生成的。