项目中进度条实现臆想

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

关于这点就需要了解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;
}

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

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

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

做到真正的进度把握。

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

时间: 2024-10-20 02:18:55

项目中进度条实现臆想的相关文章

Android中进度条类型的控件定义和妙用技巧

Android中进度条控件有3个(不算ProgressDialog),分别是ProgressBar,SeekBar和RatingBar,对于自定义样式来说又得按照需求分为2中情况,第一种是刻度型,第二种是循环类型. 第一种是"刻度型",也就是他有起点和终点,起点值小于终点值 这种样式的修改,要修改三个属性即可 分别是:背景(主要是进度的轨道样式),第一级别滚动条progressDrawable,第二级别progressDrawable 遗憾的是Android提供的api很难设置,不过可

AFHTTPSessionManager下载文件 及下载中 进度条处理,进度条处理需要特别注意,要加载NSRunLoop 中

1.下载文件 和进度条处理代码 - (void)timer:(NSTimer *)timer{ // 另一个View中 进度条progress属性赋值 _downloadView.progress = self.pressing; if (self.pressing >= 1.0) { [timer invalidate]; } } -(void)downloadWithUrlString:(NSString *)urlString { //1.创建会话管理者 AFHTTPSessionMana

QT中进度条的使用

在QT中可以用QProgressBar或着QProgressDialog来实现进度条. QProgressBar的使用 首先在designer中拖一个按钮和进度条部件,按下面初始化 //补充:下面两句写在MainWindow的构造函数里进行初始化 ui->progressBar->setRange(0,50000-1);  ui->progressBar->setValue(0); 按钮的事件处理: void MainWindow::on_pushButton_clicked()

Bootstrap中进度条的使用

<div class="container">        <h3> 普通的进度条</h3>        <div class="progress">            <div class="progress-bar" style="width: 40%" role="progress-bar" aria-valuesnow="60&

项目中多条数据保存的json实例

//js代码function checkCode(num){ var typeid = $("#typeid").val(); if(typeid == ""){ alert("请选择信息类别"); return false ; } var i = 1; for(i=1;i<=num;i++){ //判断每一行是否填写相关的值 var dataname = $("input[name='dataname"+i+"

Android ProgressBar 进度条荧光效果

http://blog.csdn.net/ywtcy/article/details/7878289 这段时间做项目,产品需求,进度条要做一个荧光效果,类似于Android4.0 浏览器中进度条那种样子.刚开始,百思不得其姐啊,还以为是用sharp文件或者canvas直接画出来的.后来一怒之下,把系统浏览器的apk包给解开了,坑爹的是,那个荧光效果的进度条居然是用的一张.9的图片,恍然大悟啊,不过,谷哥还是强大了一下,他的进度条用的并不是ProgressBar,而是重写的ImageView,当然

视频播放器进度条的制作

0.前言 今天在做进度条的时候,需要一些小困难,毕竟原来的进度条是根据vlc中的事件libvlc_MediaPlayerPositionChanged来让进度条的值+1的 可是要用一个项目中提供的exe,所以在这个项目中只能调用管道进行和exe的通信,这样,使用事件的方式基本被排除了 1.思路 既然不能用事件,那么就直接用定时器了,设定为1000ms来触发一次,进度条+1,只改变UI,可以先试试不加锁 2.实现 在UI中加入一个播放的标识,也就是UI中进度条被触发的时候(没播放的时候,UI中进度

Android自定义文本的进度条

工作中要求实现如下图中进度条(进度条上面是带比例数的文本,进度条颜色与比例数对应),写下自己的实现过程. 整体思路:Android中ProgressBar控件不支持自定义文本,所以需要写自定义progressBar. 1.progressBar上要自定义文本,需要重写onDraw()方法: 2.为实现进度是红色,底色是灰色效果,需要自定义progressBar样式 代码实现: 1.自定义的ProgressBar实现代码: 1 package com.example.myprogressbar;

android progressbar 水平进度条

<?xml version="1.0" encoding="UTF-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 定义轨道的背景 --> <item android:id="@android:id/background" android:drawable="@