程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 項目中進度條實現臆想,項目進度條臆想

項目中進度條實現臆想,項目進度條臆想

編輯:C++入門知識

項目中進度條實現臆想,項目進度條臆想


關於進度條的實現,主要把握點就是動態修改,且是行內緩沖更新。

關於這點就需要了解printf()的行緩沖問題了

可以做如下驗證

#include <stdio.h>
#include <stdlib.h>

int main()
{
    // printf("test");        case1:3秒後輸出
    printf("test\n");        //case2:立即輸出
    sleep(3);
    return 0;
}

兩個case的區別就在於\n了,所以問題的症結之處就是\n了.

printf是一個行緩沖函數,先寫到緩沖區,滿足條件後,才將緩沖區刷到對應文件中,刷緩沖區的條件如下:
  1 緩沖區填滿。
  2 寫入的字符中有‘\n’, '\r'。
  3 調用fflush手動刷新緩沖區。
  4 調用scanf要從緩沖區中讀取數據時,也會將緩沖區內的數據刷新。

  滿足上面4個條件之一緩沖區就會刷新,也就是printf會真正調用write來寫入。

  當我們執行printf的進程或者線程結束的時候會主動調用flush來刷新緩沖區,所以程序結束,也會刷新。

對於以上幾點,都是很容易進行驗證的,這裡就不分開談論了
關於進度條。

有了行緩沖問題的了解,那麼我們就可以把握主更新緩沖的時機以及方式了。

  進度條前進時更新緩沖重新寫入,方法的話就是\r了。因為我們的進度條是行 行為了

代碼實現

#include <stdio.h>
#include <string.h>
void proc()
{

    int rate = 0;
    char bar[102];
    memset(bar,'\0',sizeof(bar));

    const char * flag = "|/-\\";
    while(rate <= 100)
    {
        bar[rate] = '=';
        printf("[%-101s][%%%d][%c]\r",bar,rate,flag[rate%4]);
        fflush(stdout);
        rate ++;
        sleep(1);
    }
}

int main()
{
    proc();
    return 0;
}

  關於這個進度條問題,只是一個簡單的行緩沖了解以及簡短項目體驗而已。而實際項目中的進度條並非如此的。

個人的理解,揣摩:::因為實際程序中的進度條是需要切合工具,具體功能進度實現的。所以進度條的實現並不是一個時間軸上的有效動作。

比如文件壓縮,對於這個過程中的幾個點有相對的把控,然後以進度條作為一個伴隨進程,利用進程間關系(或者說觀察者模式),程序進行一步,報告給進度條程序前進一步。

做到真正的進度把握。

再比如網絡文件下載,首先:你可以確定讀取文件的准確大小,這時,就是根據網絡傳輸速率,文件傳輸比例進行更新跟進進度條程序。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved