zoukankan      html  css  js  c++  java
  • 项目中进度条实现臆想

    关于进度条的实现,主要把握点就是动态修改,且是行内缓冲更新。

    关于这点就需要了解printf()的行缓冲问题了

    可以做如下验证

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        // printf("test");        case1:3秒后输出
        printf("test
    ");        //case2:立即输出
        sleep(3);
        return 0;
    }

    两个case的区别就在于 了,所以问题的症结之处就是 了.

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

      满足上面4个条件之一缓冲区就会刷新,也就是printf会真正调用write来写入。

      当我们执行printf的进程或者线程结束的时候会主动调用flush来刷新缓冲区,所以程序结束,也会刷新。

    对于以上几点,都是很容易进行验证的,这里就不分开谈论了
    关于进度条。

    有了行缓冲问题的了解,那么我们就可以把握主更新缓冲的时机以及方式了。

      进度条前进时更新缓冲重新写入,方法的话就是 了。因为我们的进度条是行 行为了

    代码实现

    #include <stdio.h>
    #include <string.h>
    void proc()
    {
    
        int rate = 0;
        char bar[102];
        memset(bar,'',sizeof(bar));
    
        const char * flag = "|/-\";
        while(rate <= 100)
        {
            bar[rate] = '=';
            printf("[%-101s][%%%d][%c]
    ",bar,rate,flag[rate%4]);
            fflush(stdout);
            rate ++;
            sleep(1);
        }
    }
    
    int main()
    {
        proc();
        return 0;
    }

      关于这个进度条问题,只是一个简单的行缓冲了解以及简短项目体验而已。而实际项目中的进度条并非如此的。

    个人的理解,揣摩:::因为实际程序中的进度条是需要切合工具,具体功能进度实现的。所以进度条的实现并不是一个时间轴上的有效动作。

    比如文件压缩,对于这个过程中的几个点有相对的把控,然后以进度条作为一个伴随进程,利用进程间关系(或者说观察者模式),程序进行一步,报告给进度条程序前进一步。

    做到真正的进度把握。

    再比如网络文件下载,首先:你可以确定读取文件的准确大小,这时,就是根据网络传输速率,文件传输比例进行更新跟进进度条程序。

  • 相关阅读:
    日期时间格式
    input表单加disable的后无法获取其value值
    登录判断,清除中间变量
    弹出层嵌套
    转换qq音乐格式为mp3
    layui双击表格,跳转修改页面
    设置输入电话号码为11位
    layui表格设置,分数合计
    解决数据库传回时间类型为数字
    自定义标签
  • 原文地址:https://www.cnblogs.com/lang5230/p/5557721.html
Copyright © 2011-2022 走看看