Simular una Progress Bar en C++

Una progress bar es la barrita, generalmente verde, que aparece en sistemas operativos e infinidad de programas cuando algo se está cargando. Hoy no nos vamos a meter en asuntos de cargar archivos o algo, únicamente vamos a ver el principio básico sobre el que operan estas barras.

Nuestro programa sólo pedirá una cantidad en segundos, que será el tiempo que durará en llenarse nuestra progress bar. A la ventana donde se ejecutan nuestros programas le caben 80 caracteres de largo, así que vamos a decir que nuestra progress bar tiene una resolución de 80. El único problema es saber cuánto durará cada unidad de esas 80 para que en total se acumule el tiempo indicado.

La función delay() o Sleep()

Si en su IDE pueden usar la librería conio.h, entonces van a usar la función delay(). Si no, vamos a tener que agregar la librería windows.h y usar la función Sleep() (así con mayúscula).

Ambas funciones hacen exactamente lo mismo: paran el programa durante una cierta cantidad de tiempo en milisegundos. Por ejemplo:
cout << "Hola" << endl;
Sleep(2000);
cout << "Hace dos segundos te saludé!";

Se muestra ‘Hola’, se pausa 2 segundos y se muestra ‘Hace dos segundos te saludé!’

Para los que usan conio.h, sería algo así:
printf("Holan");
delay(2000);
printf("Hace dos segundos te saludé!");

Ahora sí, para saber cuanto tiempo durará cada unidad de nuestra barra tenemos primero que convertir los segundos a milisegundos (s*1000), luego dividirlos entre la resolución de la barra (s*1000/80). Así que nuestro programa queda así:

#include
#include
using namespace std;

int main()
{
    int s;
    cout <> s;
    for(int i=0; i<=79; i++)
        cout << "_";
    for(int i=0; i<=79; i++)
    {
        cout << "=";
        Sleep(s*1000/80);
    }
}

El primer ciclo es solo por estética, para ver hasta donde va a llenar la barra. El segundo es el que imprime la barra con sus respectivas pausas.

13 thoughts on “Simular una Progress Bar en C++

  1. Es posible que tenga un contador de porcentaje dinamico, es decir dentro de algun array, pero en una posicion, que no quede asi: 1%….2%…100% sin no que de una en un elemento de un array varie dependiendo la carga sin que se mueva de ese lugar, algo asi:
    loading [================ ][50%]
    loading [========================== ][85%]
    loading [================================][100%]
    que sea en una fila no en varias, pero que el valor [a] sea una variable respecto a la carga.
    Es posible o es mucho pedir!, le agradeceria muchisimo si es posible, GRACIAS.

    1. No creo que sea muy diferente a lo que tengo aqui, pero definitivamente tendria que usar gotoxy(); y por lo tanto conio.h, lo cual no me gusta mucho, pero si lo hago lo subo aqui mismo🙂

      1. Muchisimas Gracias, o si no tienes tiempo me podrías dar una indicación de como hacerlo, soy muy nuevo en C++, se lo básico de la programación pero no conozco una funciona para que se ingrese el dato en tiempo real y con getch no me funciona.:/

      2. Ahorita no tengo acceso a un IDE con el que puede usar <conio.h>, pero así nomás confiando en mi cerebro😄 el ciclo que imprime la progress bar sería algo así:

        for(int i=0; i<=69; i++)
            {
                gotoxy(10, i); printf("=[%d]", i*100/70);
                Sleep(s*1000/80);
            }

        Gotoxy sirve para ir a una coordenada (x, y) en la pantalla, ‘x’ se queda fijo en 10 y ‘y’ se mueve junto con ‘i’. i*100/70 es una simple regla de tres para obtener el porcentaje: ‘si 70 es a 100, 1 es a…’

        Creo que funciona, pero seguro seguro, pues no. Si usas Turbo C lo puedes ejecutar y nos cuentas que rollo.

      3. aqui tengo una funcion personalizada de GOTOXY sin usar conio.h no se como funciona pero funciona , me salvo la vida para mi proyecto de programacion básica:

        #include
        //gotoxy function
        void gotoxy(int x,int y)
        {
        printf(“%c[%d;%df”,0x1B,y,x);
        }

      4. Hay otra opción (siempre que no rellenes la línea). Cuando terminas de imprimir una línea, en lugar de enviar endl o “n”, puedes enviar “r” para volver a situar el cursor al inicio de la línea, y enviar flush para forzar que se imprima. Como en cada pasada vas a imprimir una línea más larga que la anterior, consigues el efecto buscado y sin usar conio.h ni cosas no estándar.

  2. Hola, los consejos y tutoriales de la pagina me han sido de muchisima ayuda en C++, lenguaje en el que soy realmente un principiante. En este caso tengo una duda. A pesar de que mi IDE puede usar conio.h, yo lo incluyo en el programa y me sirve para otras cosas pero no para delay().
    “Function ‘delay’ should have a prototype” me dice el panel de errores del Turbo c++. Te agradeceria me pudieras ayudar con el problema, gracias.

    1. Pues ahora que lo mencionas yo únicamente he podido usar la función delay() en las primeras versiones de Turbo C++ (el de Borland). Mejor usa Sleep() y windows.h

  3. Muchisimas gracias a todos… sencillamente muy agradecido con el post. no saben caunto me han ayudado mil gracias

  4. hola disculpa necesito crear imagenes con movimiento en dev c++ un sistema solar donde la tierra efectue sus movimientos de traslacion y rotacion sobre el sol una ayudita seria muy util

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s