elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a la Factorización De Semiprimos (RSA)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [RESUELTO] Dudas Sobre Progres Bar TUI Mode
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [RESUELTO] Dudas Sobre Progres Bar TUI Mode  (Leído 2,881 veces)
RyogiShiki


Desconectado Desconectado

Mensajes: 745


げんしけん - Hikkikomori FTW!!!


Ver Perfil WWW
[RESUELTO] Dudas Sobre Progres Bar TUI Mode
« en: 11 Diciembre 2010, 04:15 am »

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!


« Última modificación: 13 Diciembre 2010, 18:55 pm por gankutsuo » En línea

Ca0s

Desconectado Desconectado

Mensajes: 32


Ver Perfil WWW
Re: Dudas Sobre Progres Bar TUI Mode
« Respuesta #1 en: 11 Diciembre 2010, 17:18 pm »

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.


En línea

Mr.Blue


Desconectado Desconectado

Mensajes: 441



Ver Perfil WWW
Re: Dudas Sobre Progres Bar TUI Mode
« Respuesta #2 en: 12 Diciembre 2010, 03:48 am »

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:
En línea

do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: Dudas Sobre Progres Bar TUI Mode
« Respuesta #3 en: 12 Diciembre 2010, 11:32 am »

¡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!
En línea

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


Desconectado Desconectado

Mensajes: 745


げんしけん - Hikkikomori FTW!!!


Ver Perfil WWW
Re: Dudas Sobre Progres Bar TUI Mode
« Respuesta #4 en: 13 Diciembre 2010, 15:49 pm »

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

Código
  1. #include <cstdio>
  2. #include <cstdlib>
  3. #include <cstring>
  4. #include <curses.h>
  5.  
  6. #ifdef _WIN32
  7.    #include <windows.h>
  8.    #define Sleep Sleep
  9.    //#define clear system("cls")
  10. #else
  11.    #include <unistd.h>
  12.    #define Sleep sleep
  13.    //#define clear system("clear")
  14. #endif
  15.  
  16. int PorcentProgress(int Temp, int Total);
  17. /*Función para definir color de fondo del interprete*/
  18. void SetBackground(char FirstColor, char SecondColor){
  19.    assume_default_colors(FirstColor, SecondColor);
  20.    for(int i=0;i<2000;i++) {
  21.        printw("\n\r");
  22.        refresh();
  23.    }
  24. }
  25.  
  26. int main(int argc, char *argv[]){
  27.    initscr();
  28.  
  29.    FILE * File;
  30.    int Comp = 0, CordX = 7, Res, Porcent;
  31.    char Word [30] = {""};
  32.  
  33.    if(has_colors()){
  34.            start_color();
  35.    }else{
  36.        printw("Su interprete o sistema no soporta colores, el programa tendra errores de visualización");
  37.    }
  38.    SetBackground(COLOR_WHITE, COLOR_BLUE);
  39.    border(ACS_VLINE,ACS_VLINE,ACS_HLINE,ACS_HLINE,ACS_ULCORNER,ACS_URCORNER,ACS_LLCORNER,ACS_LRCORNER);
  40.    mvprintw(2,15,"Ejemplo Progress Bar");
  41.    while(Comp < 50000){
  42.        refresh();
  43.        mvprintw(5,8,"Cuantas palabras desea ingresar en el archivo (mas de 50.000): ");
  44.        scanw("%d", &Comp);
  45.    }
  46.    while(strlen(Word) == 0){
  47.        refresh();
  48.        mvprintw(7,8,"Que palabra desea ingresar: ");
  49.        scanw("%s", Word);
  50.    }
  51.    mvprintw(10,8,"[                                                  ]");
  52.    File = fopen("File.prb", "w");
  53.    for(int Cont = 0;Cont <= Comp;++Cont){
  54.        fprintf(File,"%s",Word);
  55.        Porcent = PorcentProgress(Cont,Comp);
  56.        mvprintw(11,8,"Palabras Escritas: %d de %d",Cont,Comp);
  57.        mvprintw(10,61,"%d",Porcent);
  58.        Res = Porcent;
  59.        if(/*Condición para actualizar la barra*/){
  60.            CordX += 2;
  61.            mvprintw(10,CordX,"||");
  62.        }
  63.        refresh();
  64.  
  65.    }
  66.    fclose(File);
  67.    refresh();
  68.    getch();
  69.    endwin();
  70.    return 0;
  71. }
  72.  
  73. int PorcentProgress(int Temp, int Total){
  74.    {
  75.        int Porcent;
  76.        Temp = (Temp/Total);
  77.        Temp *= 100;
  78.        return Temp;
  79.    }
  80. }
  81.  

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

;)
« Última modificación: 13 Diciembre 2010, 19:44 pm por gankutsuo » En línea

anonimo12121


Desconectado Desconectado

Mensajes: 1.813


Ver Perfil WWW
Re: Dudas Sobre Progres Bar TUI Mode
« Respuesta #5 en: 13 Diciembre 2010, 16:17 pm »

prueba hacer la regla de 3
En línea

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


Desconectado Desconectado

Mensajes: 745


げんしけん - Hikkikomori FTW!!!


Ver Perfil WWW
Re: Dudas Sobre Progres Bar TUI Mode
« Respuesta #6 en: 13 Diciembre 2010, 18:30 pm »

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.

Código
  1. #include <cstdio>
  2. #include <cstdlib>
  3. #include <cstring>
  4. #include <cmath>
  5. #include <curses.h>
  6.  
  7. #ifdef _WIN32
  8.    #include <windows.h>
  9.    #define Sleep Sleep
  10.    //#define clear system("cls")
  11. #else
  12.    #include <unistd.h>
  13.    #define Sleep sleep
  14.    //#define clear system("clear")
  15. #endif
  16.  
  17. float PorcentProgress(float Temp, float Total);
  18. /*Función para definir color de fondo del interprete*/
  19. void SetBackground(char FirstColor, char SecondColor){
  20.    assume_default_colors(FirstColor, SecondColor);
  21.    for(int i=0;i<2000;i++) {
  22.        printw("\n\r");
  23.        refresh();
  24.    }
  25. }
  26.  
  27. void ReDraw(){
  28.    border(ACS_VLINE,ACS_VLINE,ACS_HLINE,ACS_HLINE,ACS_ULCORNER,ACS_URCORNER,ACS_LLCORNER,ACS_LRCORNER);
  29. }
  30.  
  31. int main(int argc, char *argv[]){
  32.    initscr();
  33.  
  34.    FILE * File;
  35.    int CordX = 8;
  36.    float Res, Porcent, Comp = 0;
  37.    char Word [30] = {""};
  38.  
  39.    if(has_colors()){
  40.            start_color();
  41.    }else{
  42.        printw("Su interprete o sistema no soporta colores, el programa tendra errores de visualización");
  43.    }
  44.    SetBackground(COLOR_WHITE, COLOR_BLUE);
  45.    ReDraw();
  46.    mvprintw(2,15,"Ejemplo Progress Bar");
  47.    while(Comp < 50000){
  48.        mvprintw(5,8,"Cuantas palabras desea ingresar en el archivo (mas de 50.000): ");
  49.        scanw("%f", &Comp);
  50.        ReDraw();
  51.        refresh();
  52.    }
  53.    while(strlen(Word) == 0){
  54.        mvprintw(7,8,"Que palabra desea ingresar: ");
  55.        scanw("%s", Word);
  56.        ReDraw();
  57.        refresh();
  58.    }
  59.    mvprintw(10,8,"[                                                ]");
  60.    File = fopen("File.prb", "w");
  61.    for(float Cont = 0;Cont <= Comp;++Cont){
  62.        fprintf(File,"%s",Word);
  63.        Porcent = PorcentProgress(Cont,Comp);
  64.        mvprintw(11,8,"Palabras Escritas: %d de %d",(int)Cont,(int)Comp);
  65.        mvprintw(10,61,"%f",Porcent);
  66.        mvprintw(13,8,"%f %f ",Porcent,fmodf(Porcent, 2));
  67.        if(fmodf(Porcent, 2) == 0){
  68.            CordX += 1;
  69.            mvprintw(10,CordX,"|");
  70.        }
  71.        refresh();
  72.  
  73.    }
  74.    fclose(File);
  75.    refresh();
  76.    getch();
  77.    endwin();
  78.    return 0;
  79. }
  80.  
  81. float PorcentProgress(float Temp, float Total){
  82.    {
  83.        float Porcent;
  84.        Porcent = (Temp/Total);
  85.        Porcent = Porcent*100;
  86.        return Porcent;
  87.    }
  88. }
  89.  
  90.  

Gracias a todos! ;)
« Última modificación: 13 Diciembre 2010, 19:44 pm por gankutsuo » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Tengo varias dudas sobre DVD a formato FLV, y otras cosas sobre FLV
Multimedia
SaintGermain 0 2,261 Último mensaje 30 Mayo 2005, 21:47 pm
por SaintGermain
[DUDAS] Todas las dudas sobre RadASD + MASM aqui « 1 2 3 »
ASM
AleX Inc. 23 21,115 Último mensaje 5 Julio 2010, 11:58 am
por Eternal Idol
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines