最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Linux在命令行環(huán)境中實(shí)現(xiàn)進(jìn)度條的原理解析

 更新時(shí)間:2025年10月16日 10:12:47   作者:倔強(qiáng)的石頭_  
在Linux命令行環(huán)境中,進(jìn)度條是一種直觀展示任務(wù)執(zhí)行進(jìn)度的重要方式,本文將通過一個(gè)簡(jiǎn)單的C語(yǔ)言進(jìn)度條程序,深入解析其實(shí)現(xiàn)原理和優(yōu)化過程,希望對(duì)大家有所幫助

引言

在Linux命令行環(huán)境中,進(jìn)度條是一種直觀展示任務(wù)執(zhí)行進(jìn)度的重要方式。

本文將通過一個(gè)簡(jiǎn)單的C語(yǔ)言進(jìn)度條程序,深入解析其實(shí)現(xiàn)原理和優(yōu)化過程

進(jìn)度條基礎(chǔ)原理

進(jìn)度條的核心功能是將一個(gè)耗時(shí)操作的完成情況以可視化的方式展示給用戶。在命令行環(huán)境中,我們通常使用字符界面來(lái)實(shí)現(xiàn)這一功能。

一個(gè)基本的進(jìn)度條需要包含以下元素:

  • 進(jìn)度指示條:通常用字符填充表示已完成部分
  • 百分比數(shù)值:精確顯示當(dāng)前完成比例
  • 動(dòng)畫效果:通過字符變化提供視覺反饋
  • 動(dòng)態(tài)刷新:實(shí)時(shí)更新顯示內(nèi)容

基礎(chǔ)版進(jìn)度條實(shí)現(xiàn)

我們先來(lái)看第一個(gè)版本的進(jìn)度條實(shí)現(xiàn):

// process.h
#pragma once
#include <stdio.h>
//v1
void process();
// process.c (v1部分)
#include "process.h"
#include <string.h>
#include <unistd.h>

#define SIZE 101
#define STYLE '='

// v1: 展示進(jìn)度條基本功能
void process()
{
    int rate = 0;
    char buffer[SIZE];
    memset(buffer, 0, sizeof(buffer));
    const char *lable = "|/-\\";
    int len = strlen(lable);

    while(rate <= 100)
    {
        printf("[%-100s][%d%%][%c]\r", buffer, rate, lable[rate%len]);
        fflush(stdout);
        buffer[rate] = STYLE;
        rate++;
        usleep(10000);
    }

    printf("\n");
}

這個(gè)基礎(chǔ)版本的進(jìn)度條實(shí)現(xiàn)了以下功能:

  • 使用字符=填充進(jìn)度條
  • 通過|/-\字符循環(huán)實(shí)現(xiàn)旋轉(zhuǎn)動(dòng)畫效果
  • 使用\r回車符實(shí)現(xiàn)單行刷新
  • 通過fflush(stdout)強(qiáng)制刷新輸出緩沖區(qū)

關(guān)鍵點(diǎn)解析:

\r的作用:將光標(biāo)移動(dòng)到行首,實(shí)現(xiàn)覆蓋刷新

輸出緩沖區(qū)刷新:確保每次輸出立即顯示

旋轉(zhuǎn)動(dòng)畫:通過數(shù)組循環(huán)選擇不同字符實(shí)現(xiàn)

解耦與通用化設(shè)計(jì)

基礎(chǔ)版本雖然實(shí)現(xiàn)了進(jìn)度條的基本功能,但存在明顯的局限性:

  • 進(jìn)度條邏輯與具體業(yè)務(wù)強(qiáng)耦合
  • 無(wú)法靈活應(yīng)用于不同場(chǎng)景
  • 固定的刷新頻率和樣式

為了解決這些問題,我們來(lái)看第二個(gè)版本的實(shí)現(xiàn):

// process.h (v2部分)
//v2
void FlushProcess(const char*, double total, double current);
// process.c (v2部分)
#include "process.h"
#include <string.h>
#include <unistd.h>

#define SIZE 101
#define STYLE '='

//v2: 根據(jù)進(jìn)度,動(dòng)態(tài)刷新一次進(jìn)度條
void FlushProcess(const char *tips, double total, double current)
{
    const char *lable = "|/-\\";
    int len = strlen(lable);
    static int index = 0;
    char buffer[SIZE];
    memset(buffer, 0, sizeof(buffer));

    double rate = current*100.0/total;
    int num = (int)rate;

    int i = 0;
    for(; i < num; i++)
        buffer[i] = STYLE;

    printf("%s...[%-100s][%.1lf%%][%c]\r", tips, buffer, rate, lable[index++]);
    fflush(stdout);
    index %= len;

    if(num >= 100)printf("\n");
}

這個(gè)版本的主要改進(jìn)在于:

  • 將進(jìn)度條更新邏輯解耦為獨(dú)立函數(shù)
  • 使用double類型支持更精確的進(jìn)度計(jì)算
  • 支持自定義提示信息
  • 自動(dòng)處理完成狀態(tài)

解耦后的進(jìn)度條函數(shù)具有更好的通用性,可以應(yīng)用于各種不同的場(chǎng)景。

回調(diào)機(jī)制與業(yè)務(wù)集成

為了將進(jìn)度條應(yīng)用到實(shí)際業(yè)務(wù)中,我們采用回調(diào)函數(shù)機(jī)制:

// main.c
#include "process.h"
#include <unistd.h>
#include <time.h>
#include <stdlib.h>

//函數(shù)指針類型
typedef void (*call_t)(const char*,double,double);

double total = 1024.0;
double speed[] = {1.0, 0.5, 0.3, 0.02, 0.1, 0.01};

//回調(diào)函數(shù)
void download(int total, call_t cb)
{
    srand(time(NULL));
    double current = 0.0;
    while(current <= total)
    {
        cb("下載中", total, current); // 進(jìn)行回調(diào)
        if(current>=total) break;
        // 下載代碼
        int random = rand()%6;
        usleep(5000);
        current += speed[random];
        if(current>=total) current = total;
    }
}

void uploadload(int total, call_t cb)
{
    srand(time(NULL));
    double current = 0.0;
    while(current <= total)
    {
        cb("上傳中", total, current); // 進(jìn)行回調(diào)
        if(current>=total) break;
        // 下載代碼
        int random = rand()%6;
        usleep(5000);
        current += speed[random];
        if(current>=total) current = total;
    }
}

int main()
{
    download(1024.0, FlushProcess);
    printf("download 1024.0MB done\n");
    download(512.0, FlushProcess);
    printf("download 512.0MB done\n");
    download(256.0,FlushProcess);
    printf("download 256.0MB done\n");
    download(128.0,FlushProcess);
    printf("download 128.0MB done\n");
    download(64.0,FlushProcess);
    printf("download 64.0MB done\n");
    uploadload(500.0, FlushProcess);
    return 0;
}

這個(gè)設(shè)計(jì)的關(guān)鍵點(diǎn)在于:

  • 使用函數(shù)指針類型call_t定義回調(diào)接口
  • 業(yè)務(wù)函數(shù)(download/upload)專注于業(yè)務(wù)邏輯
  • 通過回調(diào)函數(shù)更新進(jìn)度條
  • 實(shí)現(xiàn)了不同業(yè)務(wù)場(chǎng)景下的進(jìn)度展示

進(jìn)階優(yōu)化思路

基于現(xiàn)有代碼,我們可以進(jìn)一步優(yōu)化:

  • 增加顏色支持:使用ANSI轉(zhuǎn)義序列添加顏色
  • 支持多種樣式:可以通過配置選擇不同的進(jìn)度條樣式
  • 動(dòng)態(tài)調(diào)整寬度:根據(jù)終端寬度自動(dòng)調(diào)整進(jìn)度條長(zhǎng)度
  • 增加ETA估計(jì):根據(jù)歷史速度估算剩余時(shí)間

下面是一個(gè)增加顏色支持的示例代碼:

// 添加顏色支持的進(jìn)度條函數(shù)
void FlushProcessColor(const char *tips, double total, double current)
{
    const char *lable = "|/-\\";
    int len = strlen(lable);
    static int index = 0;
    char buffer[SIZE];
    memset(buffer, 0, sizeof(buffer));

    double rate = current*100.0/total;
    int num = (int)rate;

    int i = 0;
    for(; i < num; i++)
        buffer[i] = STYLE;

    // 根據(jù)進(jìn)度設(shè)置不同顏色
    const char *color = "\033[0;32m"; // 默認(rèn)綠色
    if(rate < 30.0) color = "\033[0;31m"; // 紅色
    else if(rate < 70.0) color = "\033[0;33m"; // 黃色
    
    printf("%s%s...[%-100s][%.1lf%%][%c]\033[0m\r", color, tips, buffer, rate, lable[index++]);
    fflush(stdout);
    index %= len;

    if(num >= 100)printf("\n");
}

總結(jié)

通過這個(gè)簡(jiǎn)單的進(jìn)度條程序,我們學(xué)習(xí)了:

  • 命令行界面的動(dòng)態(tài)刷新技術(shù)
  • 函數(shù)解耦和通用化設(shè)計(jì)
  • 回調(diào)機(jī)制的應(yīng)用
  • C語(yǔ)言中的字符串處理和格式化輸出

進(jìn)度條雖然看似簡(jiǎn)單,但涉及到了界面設(shè)計(jì)、算法優(yōu)化和系統(tǒng)交互等多個(gè)方面的知識(shí)。在實(shí)際開發(fā)中,我們可以根據(jù)需求進(jìn)一步擴(kuò)展這個(gè)基礎(chǔ)框架,實(shí)現(xiàn)更復(fù)雜、更美觀的進(jìn)度展示功能。

到此這篇關(guān)于Linux在命令行環(huán)境中實(shí)現(xiàn)進(jìn)度條的原理解析的文章就介紹到這了,更多相關(guān)Linux命令行進(jìn)度條內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • linux使用nginx部署vue、react項(xiàng)目實(shí)踐

    linux使用nginx部署vue、react項(xiàng)目實(shí)踐

    本文詳細(xì)介紹了在CentOS?Stream?8上安裝和配置Nginx的過程,包括安裝依賴、下載和解壓Nginx、安裝Nginx模塊、配置Nginx.conf文件以及啟動(dòng)Nginx等步驟
    2026-03-03
  • linux系統(tǒng)之如何禁用usb口

    linux系統(tǒng)之如何禁用usb口

    這篇文章主要介紹了linux系統(tǒng)之如何禁用usb口問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • Linux系統(tǒng)設(shè)置PATH環(huán)境變量(3種方法)

    Linux系統(tǒng)設(shè)置PATH環(huán)境變量(3種方法)

    這篇文章主要介紹了Linux系統(tǒng)設(shè)置PATH環(huán)境變量(3種方法),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • VMware下CentOS 6.7安裝圖文教程

    VMware下CentOS 6.7安裝圖文教程

    這篇文章主要為大家詳細(xì)介紹了VMware下CentOS 6.7安裝圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • Linux終端提示符(prompt)不如期生效的原因分析與解決

    Linux終端提示符(prompt)不如期生效的原因分析與解決

    Linux命令行是系統(tǒng)管理員管理Linux的重要手段,我們管理Linux,首先要面對(duì)的就是Linux命令行提示符。下面這篇文章主要給大家介紹了Linux終端提示符(prompt)不如期生效的原因以及解決方法,需要的朋友可以參考下。
    2017-07-07
  • Apache?HertzBeat?安裝使用完整指南

    Apache?HertzBeat?安裝使用完整指南

    Apache?HertzBeat?是AI?驅(qū)動(dòng)、無(wú)?Agent、一站式開源實(shí)時(shí)觀測(cè)系統(tǒng),支持指標(biāo)/日志統(tǒng)一采集、告警智能分發(fā)、靈活自定義監(jiān)控,兼容多協(xié)議與云原生環(huán)境,本文基于?Gitee?官方倉(cāng)庫(kù)整理最全安裝、配置、使用流程,小白也能快速上手
    2026-04-04
  • linux修改文件所屬用戶和組的實(shí)例方法

    linux修改文件所屬用戶和組的實(shí)例方法

    在本篇文章里小編給大家整理的是一篇關(guān)于linux修改文件所屬用戶和組的實(shí)例方法,對(duì)此有興趣的朋友們可以跟著學(xué)習(xí)下。
    2021-12-12
  • linux?和?dockerfile?中配置環(huán)境變量的方式總結(jié)

    linux?和?dockerfile?中配置環(huán)境變量的方式總結(jié)

    要熟悉?dockerfile?配置?linux?的知識(shí)不能少,所以本文將給大家總結(jié)?linux?與?dockerfile?中各種環(huán)境變量,需要的朋友可以參考下
    2023-07-07
  • Linux系統(tǒng)配置網(wǎng)絡(luò)詳細(xì)介紹

    Linux系統(tǒng)配置網(wǎng)絡(luò)詳細(xì)介紹

    大家好,本篇文章主要講的是Linux系統(tǒng)配置網(wǎng)絡(luò)詳細(xì)介紹,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • Linux基礎(chǔ)學(xué)習(xí)之利用tcpdump抓包實(shí)例代碼

    Linux基礎(chǔ)學(xué)習(xí)之利用tcpdump抓包實(shí)例代碼

    tcpdump是Linux下面的一個(gè)開源的抓包工具,和Windows下面的wireshark抓包工具一樣, 支持抓取指定網(wǎng)口、指定目的地址、指定源地址、指定端口、指定協(xié)議的數(shù)據(jù)。下面這篇文章主要給大家介紹了關(guān)于Linux基礎(chǔ)學(xué)習(xí)之利用tcpdump抓包的相關(guān)資料,需要的朋友可以參考下。
    2017-12-12

最新評(píng)論

平潭县| 辽宁省| 洛宁县| 武安市| 闵行区| 普兰店市| 扬中市| 车致| 丽江市| 张家界市| 西丰县| 贞丰县| 宣武区| 普宁市| 囊谦县| 江都市| 平塘县| 泊头市| 龙口市| 志丹县| 湟源县| 休宁县| 湖南省| 深水埗区| 依安县| 东海县| 辉县市| 苏尼特左旗| 灵石县| 乌拉特中旗| 舟山市| 廊坊市| 剑阁县| 灌南县| 乌恰县| 青岛市| 抚州市| 普宁市| 永登县| 兖州市| 虎林市|