[RESUELTO] Dudas Sobre Progres Bar TUI Mode

Iniciado por RyogiShiki, 11 Diciembre 2010, 04:15 AM

0 Miembros y 1 Visitante están viendo este tema.

RyogiShiki

Hola!.

Buenas a todos. A continuación mi duda:

Bueno, siempre he tenido una duda sobre barras de progreso. el caso es que programar el funcionamiento de la barra es bastante fácil, lo que me tiene confundido es la forma de implementarlo a alguna operación que esté realizando el programa en ese momento. Por ejemplo si estoy creando un archivo en el que estoy insertando una cantidad grande de datos, como haria para que la barra de progreso funcione mientras la inserción de datos se hace y termine cuando la inserción de datos lo haga. Claro, como dice el título esto sobre una interfaz de texto.

Les agradecería mucho la aclaración de esto ;)

Saludos!


Ca0s

Nunca lo hice, pero podrías calcular la cantidad de datos totales a insertar, dividir entre 100 por ejemplo) y cada vez que has inroducido un multiplo de ese numero de datos actualizas la barra.
Si no, puedes hacer un cálculo del tiempo que podría llevar la tarea, ir actualizando ese cálculo a medida que vas haciéndo operaciones según la velocidad que lleve, e ir actualizando la barra sehún lo que lleves/quede.

Mr.Blue

Se podria usar una funcion que llame a barradecarga por ej y eso dentro de un while eh ir mostrando mientras no sea fin de archivo. :rolleyes:

do-while

¡Buenas!

Sr.Blanco tiene razon. Podrias hacerlo mientras vas cargando lo que quieras cargar. Eso si. Siempre deberias saber cuanto te llevara realizar el total de la operacion (en bytes, tiempo, operaciones...) y cuanto trabajo has hecho en la misma unidad de media para poder calcular un porcentaje sobre las operaciones realizadas con respecto al total esperado (prebiamente calculado con exactitud), para asi poder mostrar de forma razonable el progreso realizado.

¡Saludos!
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!

RyogiShiki

#4
Bien, Gracias a todos por sus ayudas y aportes, sigo teniendo algunos problemas, primero estos son los avances:

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <curses.h>

#ifdef _WIN32
   #include <windows.h>
   #define Sleep Sleep
   //#define clear system("cls")
#else
   #include <unistd.h>
   #define Sleep sleep
   //#define clear system("clear")
#endif

int PorcentProgress(int Temp, int Total);
/*Función para definir color de fondo del interprete*/
void SetBackground(char FirstColor, char SecondColor){
   assume_default_colors(FirstColor, SecondColor);
   for(int i=0;i<2000;i++) {
       printw("\n\r");
       refresh();
   }
}

int main(int argc, char *argv[]){
   initscr();

   FILE * File;
   int Comp = 0, CordX = 7, Res, Porcent;
   char Word [30] = {""};

   if(has_colors()){
           start_color();
   }else{
       printw("Su interprete o sistema no soporta colores, el programa tendra errores de visualización");
   }
   SetBackground(COLOR_WHITE, COLOR_BLUE);
   border(ACS_VLINE,ACS_VLINE,ACS_HLINE,ACS_HLINE,ACS_ULCORNER,ACS_URCORNER,ACS_LLCORNER,ACS_LRCORNER);
   mvprintw(2,15,"Ejemplo Progress Bar");
   while(Comp < 50000){
       refresh();
       mvprintw(5,8,"Cuantas palabras desea ingresar en el archivo (mas de 50.000): ");
       scanw("%d", &Comp);
   }
   while(strlen(Word) == 0){
       refresh();
       mvprintw(7,8,"Que palabra desea ingresar: ");
       scanw("%s", Word);
   }
   mvprintw(10,8,"[                                                  ]");
   File = fopen("File.prb", "w");
   for(int Cont = 0;Cont <= Comp;++Cont){
       fprintf(File,"%s",Word);
       Porcent = PorcentProgress(Cont,Comp);
       mvprintw(11,8,"Palabras Escritas: %d de %d",Cont,Comp);
       mvprintw(10,61,"%d",Porcent);
       Res = Porcent;
       if(/*Condición para actualizar la barra*/){
           CordX += 2;
           mvprintw(10,CordX,"||");
       }
       refresh();

   }
   fclose(File);
   refresh();
   getch();
   endwin();
   return 0;
}

int PorcentProgress(int Temp, int Total){
   {
       int Porcent;
       Temp = (Temp/Total);
       Temp *= 100;
       return Temp;
   }
}


Bueno, todo ha ido bien en la inserción de datos, y el calcuo del porcentaje debe ser correcto. Pero tengo algunos problemas: En primer lugar el numero que muestra el porcentaje de la barra no se actualiza como lo hacen los datos escritos, sino que permanece en 0 todo el proceso hasta que finaliza y cambia a 100, ahora gracias a todas sus ideas y el analisis de unaventana de descargas de firefox (XD) la idea era tener 50 espacios disponibles para caracteres a la hora de llenar la barra, así cada que pasara un 2% de la operación se incertaria 1 caracter en la barra, para cuando llegará a 100% se habrían insertado 50 caracteres y la barra estaría completa, el problema es que al realizar el calculo de los porcentajes el valor devuelto es un entero es por eso que mientras pasa de 2.1% a 2.9% siempre devuelve un entero 2 lo que hace que la barra de actualice innecesariamente, he probado cambiando a un tipo float, pero entonces la operación de residuo para saber si el numoro es par no está permitida (%) y si convierto a entero pasará lo que ya había explicado y la barra se actualizará innecesariamente, en el código pueden ver expuestas la versión que solo usa enteros para el proceso.

Con lo anterior, me gustaría escuchar las sus sugerencias. Que opinan, las criticas y objeciones también son bienvenidas. Gracias por los aportes de antes, y de antemano gracias por los aportes que lleguen a hacer.

PD: El código está escrito con la libreria curses, si están en Win y no saben como ejecutarlo o quieren saber de curses visiten http://pdcurses.slashon.com/
PD: Aunque ya lo deben saber para compilar desde *nix con gcc simplemente en una terminal insertan: gcc bpr.cpp bpr -o -lncurses

;)


anonimo12121

Página para ganar Bitcoins y Dinero: http://earnbit.hol.es/
Video de YouTube con Hack para el LoL: http://adf.ly/5033746/youtube-lolemuhack
Si quieres ganar dinero con adfly entra y registrate aquí -> http://adf.ly/?id=5033746

RyogiShiki

#6
Bueno gracias a todos por su ayuda, al final lo he resuelto, los errores estaban en los tipos de las variables declaradas y como las mostraba por el printf, así que si a alguien le interesa implementar una barra de progreso en una TUI a continuación dejo el código resultante, ya saben, las criticas y objeciones son bienvenidas.

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <curses.h>

#ifdef _WIN32
   #include <windows.h>
   #define Sleep Sleep
   //#define clear system("cls")
#else
   #include <unistd.h>
   #define Sleep sleep
   //#define clear system("clear")
#endif

float PorcentProgress(float Temp, float Total);
/*Función para definir color de fondo del interprete*/
void SetBackground(char FirstColor, char SecondColor){
   assume_default_colors(FirstColor, SecondColor);
   for(int i=0;i<2000;i++) {
       printw("\n\r");
       refresh();
   }
}

void ReDraw(){
   border(ACS_VLINE,ACS_VLINE,ACS_HLINE,ACS_HLINE,ACS_ULCORNER,ACS_URCORNER,ACS_LLCORNER,ACS_LRCORNER);
}

int main(int argc, char *argv[]){
   initscr();

   FILE * File;
   int CordX = 8;
   float Res, Porcent, Comp = 0;
   char Word [30] = {""};

   if(has_colors()){
           start_color();
   }else{
       printw("Su interprete o sistema no soporta colores, el programa tendra errores de visualización");
   }
   SetBackground(COLOR_WHITE, COLOR_BLUE);
   ReDraw();
   mvprintw(2,15,"Ejemplo Progress Bar");
   while(Comp < 50000){
       mvprintw(5,8,"Cuantas palabras desea ingresar en el archivo (mas de 50.000): ");
       scanw("%f", &Comp);
       ReDraw();
       refresh();
   }
   while(strlen(Word) == 0){
       mvprintw(7,8,"Que palabra desea ingresar: ");
       scanw("%s", Word);
       ReDraw();
       refresh();
   }
   mvprintw(10,8,"[                                                ]");
   File = fopen("File.prb", "w");
   for(float Cont = 0;Cont <= Comp;++Cont){
       fprintf(File,"%s",Word);
       Porcent = PorcentProgress(Cont,Comp);
       mvprintw(11,8,"Palabras Escritas: %d de %d",(int)Cont,(int)Comp);
       mvprintw(10,61,"%f",Porcent);
       mvprintw(13,8,"%f %f ",Porcent,fmodf(Porcent, 2));
       if(fmodf(Porcent, 2) == 0){
           CordX += 1;
           mvprintw(10,CordX,"|");
       }
       refresh();

   }
   fclose(File);
   refresh();
   getch();
   endwin();
   return 0;
}

float PorcentProgress(float Temp, float Total){
   {
       float Porcent;
       Porcent = (Temp/Total);
       Porcent = Porcent*100;
       return Porcent;
   }
}



Gracias a todos! ;)