在Linux上编写进度条

一.进度条的概念

进度条即计算机在处理任务时,实时的,以图片形式显示处理任务的速度,完成度,剩余未完成任务的大小,和可能需要处理的时间,一般以长方形条状形式显示。

二.进度条的几个要素

显示进度条必备的几个要素有完成任务的百分比,任务进行状态的显示和已完成任务的多少表示。本文采用数字描述完成任务的百分比,用符号'-','/','|','\'来表示任务进行的状态,用连续的'#'表示已完成的任务量。同时为了显示过程,还应该延缓时间。

三.进度条的一些版本

由以上分析,可以写出第一个版本:

#include<stdio.h>                                                                                                                       
  2 #include<unistd.h>                                                                                                                      
  3 int main()                                                                                                                              
  4 {                                                                                                                                       
  5   char string[4]={'-','/','|','\\'};                                                                                                    
  6   char buf[100]={0};                                                                                                                    
  7   int i=0;                                                                                                                              
  8   for(;i<=100;i++)                                                                                                                      
  9   {                                                                                                                                     
 10     printf("[%d]",i);                                                                                                                   
 11     printf("[%c]",string[i%4]);                                                                                                         
 12     buf[i]='#';                                                                                                                         
 13     printf("%s\n",buf);                                                                                                                   
 14     usleep(100*1000);                                                                                                                   
 15   }                                                                                                                                     
 16   return 0;                                                                                                                             
 17 }                                                                                                                                       
~                                                                                                                                                                     

部分结果图: 

该版本很久才能出来结果,而且结果是输出了100行。

结果很久才能出来的原因:数据当前还在缓冲区。printf语句把要输出的数据都存在缓冲区里,只有缓冲区的数据满了,才会一块输出。

改进:使用fflush(stdout)函数,把标准输出的函数输出到显示屏。

输出100行的原因:使用了\n,\n是换行的意思。循环100次,输出100行。

改进:把\n换为\r,\r是回车符,使光标回到该行起始位置,不会另起新行。而\n换行,会另起新行。

改进的版本二为:

 #include<stdio.h>                                                                                                                       
  2 #include<unistd.h>                                                                                                                      
  3 int main()                                                                                                                              
  4 {                                                                                                                                       
  5   char string[4]={'-','/','|','\\'};                                                                                                    
  6   char buf[100]={0};                                                                                                                    
  7   int i=0;                                                                                                                              
  8   for(;i<=100;i++)                                                                                                                      
  9   {                                                                                                                                     
 10     printf("[%d]",i);                                                                                                                   
 11     printf("[%c]",string[i%4]);                                                                                                         
 12     buf[i]='#';                                                                                                                         
 13     printf("%s\r",buf);                                                                                                                 
 14     fflush(stdout);                                                                                                                     
 15     usleep(100*1000);                                                                                                                   
 16   }                                                                                                                                     
 17   return 0;                                                                                                                             
 18 }    

结果实现了在一行中,动态显示进度。但是颜色全为黑色,为了更美观,下面对进度设置颜色,实现版本三。

#include<stdio.h>                                                                                                                       
  2 #include<unistd.h>                                                                                                                      
  3 #define BLACK "\e[0;30m"                                                                                                                
  4 #define YELLOW "\e[1;33m"                                                                                                               
  5 #define GREEN "\e[0;32m"                                                                                                                
  6 #define BLUE "\e[0;34m"                                                                                                                 
  7 #define RED "\e[0;31m"                                                                                                                  
  8 int main()                                                                                                                              
  9 {                                                                                                                                       
 10   char string[4]={'-','/','|','\\'};                                                                                                    
 11   char buf[100]={0};                                                                                                                    
 12   int i=0;                                                                                                                              
 13   for(;i<=100;i++)                                                                                                                      
 14   {                                                                                                                                     
 15     buf[i]='#';                                                                                                                         
 16     printf(BLACK"[%d]",i);                                                                                                              
 17     if(i<=25)                                                                                                                           
 18     {                                                                                                                                   
 19        printf(YELLOW"[%c]",string[i%4]);                                                                                                
 20        printf(YELLOW"[%s]\r",buf);                                                                                                      
 21     }                                                                                                                                   
 22     else if(i<=50)                                                                                                                      
 23     {                                                                                                                                   
 24       printf(GREEN"[%c]",string[i%4]);                                                                                                  
 25       printf(GREEN"[%s]\r",buf);                                                                                                        
 26     }                                                                                                                                   
 27     else if(i<=75)                                                                                                                      
 28     {                                                                                                                                   
 29       printf(BLUE"[%c]",string[i%4]);                                                                                                   
 30       printf(BLUE"[%s]\r",buf);                                                                                                         
 31     }                                                                                                                                   
 32     else{                             
 33        printf(RED"[%c]",string[i%4]);                                                                                                     
 34        printf(RED"[%s]\r",buf);                                                                                                           
 35     }                                                                                                                                   
 36     fflush(stdout);                                                                                                                     
 37     usleep(100*1000);                                                                                                                   
 38   }                                                                                                                                     
 39   return 0;                                                                                                                             
 40 }             

最终实现彩色的进度条。

四.编写进度条涉及的几个点

1.\r与\n的区别

\n:换行,会重新起行。

\r:回车符,不换行,使光标回到该行起始处。

2.sleep和usleep

二者都是控制系统休眠,sleep以秒为单位,usleep以微秒为单位。本文中设置了0.1秒。

3.fflush函数

fflush函数常用于处理磁盘文件,fflush()会强迫将缓冲区内的数据写回参数stream 指定的文件中。本文中fflush将缓冲区的数据写到标准输出流stdout中。

4.unistd头文件

unistd头文件是Linux系统编程中最重要的头文件,包含了操作系统对程序员提供的API(应用系统编程接口)。

 

 

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是实现上述功能的示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <stdbool.h> // 判断是否为质数 bool is_prime(int n) { if (n <= 1) { return false; } for (int i = 2; i * i <= n; i++) { if (n % i == 0) { return false; } } return true; } // 进度条 void progress_bar(int percent) { printf("["); for (int i = 0; i < 50; i++) { if (i < percent / 2) { printf("#"); } else { printf(" "); } } printf("] %d%%\r", percent); fflush(stdout); } // 线程函数 void *thread_func(void *arg) { int n = *(int *)arg; bool result = is_prime(n); if (result) { printf("%d is prime.\n", n); } else { printf("%d is not prime.\n", n); } return NULL; } int main(int argc, char *argv[]) { if (argc != 3) { printf("Usage: %s <num1> <num2>\n", argv[0]); return 1; } int num1 = atoi(argv[1]); int num2 = atoi(argv[2]); // 初始化线程属性 pthread_attr_t threadattr; pthread_attr_init(&threadattr); // 创建线程 pthread_t thread1, thread2; pthread_create(&thread1, &threadattr, thread_func, &num1); pthread_create(&thread2, &threadattr, thread_func, &num2); // 等待线程结束 pthread_join(thread1, NULL); pthread_join(thread2, NULL); // 销毁线程属性 pthread_attr_destroy(&threadattr); // 显示进度条 for (int i = 0; i <= 100; i += 10) { progress_bar(i); usleep(500000); } printf("\n"); return 0; } ``` 在命令行中执行该程序,需要输入两个参数,如下所示: ```bash $ ./program 12345 67890 ``` 程序将创建两个线程,每个线程分别判断一个数字是否为质数。等待两个线程结束后,程序将显示一个简单的进度条,表示程序正在运行。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值