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


 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (Moderadores: Novlucker, seba123neo, kub0x, Eleкtro)
| | | |-+  Calcular porcentaje
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Calcular porcentaje  (Leído 823 veces)
Meta


Desconectado Desconectado

Mensajes: 2.997



Ver Perfil WWW
Calcular porcentaje
« en: 21 Agosto 2017, 12:50 »

Hola:

Hice esta aplicación para enviar datos a EEPROM tipo 24LCxx por I2C con Arduino. Tabajando con C#, ya puedo enviar los datos al puerto serie. Puede contar los bytes enviados. El problema, que estoy machacando la cabeza que no hay manera de hacer fucnionar en la barra del progreso que me cuenta el "label_Por_ciento" del 0 % al 100 %.



Ya puedeo envair datos y cancelarlo.
Código
  1.        private void TestDoEvents()
  2.        {
  3.            byte[] archivo = File.ReadAllBytes(textBox_ubicacion_archivo.Text); // Carga el archivo en el array.
  4.  
  5.            progressBar_barrra_progreso.Maximum = archivo.Length; // Hasta donde llegue el tamaño del archivo.
  6.  
  7.            for (int i = 0; i <= archivo.GetUpperBound(0); i++)
  8.            {
  9.                serialPort1.Write(archivo, i, 1);
  10.  
  11.                progressBar_barrra_progreso.Value = i;
  12.  
  13.                label_Bytes_transmitidos.Text = i.ToString() + " Bytes.";
  14.  
  15.                Application.DoEvents();
  16.                if (alto == true)
  17.                {
  18.                    alto = false;
  19.                    break; // TODO: might not be correct. Was : Exit For
  20.                }
  21.            }
  22.            button_Cancelar.Text = "Arranque";
  23.        }

Botón.
Código
  1.        private void button_Cancelar_Click(object sender, EventArgs e)
  2.        {
  3.            if (button_Cancelar.Text == "Arranque")
  4.            {
  5.                button_Cancelar.Text = "Cancelar";
  6.                TestDoEvents();
  7.                progressBar_barrra_progreso.Value = 0; // Resetear progressBar a 0.
  8.                label_Bytes_transmitidos.Text = "0";
  9.            }
  10.            else
  11.            {
  12.                if (alto == true)
  13.                {
  14.                    alto = false;
  15.                }
  16.                else
  17.                {
  18.                    alto = true;
  19.                    button_Cancelar.Text = "Arranque";
  20.                }
  21.            }
  22.        }

¿Alguna idea?

Saludos.


En línea

Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/
ivancea96


Desconectado Desconectado

Mensajes: 3.295


ASMático


Ver Perfil WWW
Re: Calcular porcentaje
« Respuesta #1 en: 21 Agosto 2017, 13:16 »

Qué es el "label_Por_ciento"? Dónde lo modificas?


En línea

NEBIRE


Desconectado Desconectado

Mensajes: 709


Ver Perfil
Re: Calcular porcentaje
« Respuesta #2 en: 21 Agosto 2017, 13:47 »

La barra de progreso, siempre va desde el valor mínimo al valor máximo.

Para que vaya del 0 al 100, esos deben ser los valores límites.

Si necesitas que se ajuste a esos límites, una de dos, o pones esos límites y trabajas con los que hay o pones los que hay y formateas esos límites (sin embargo, no tenemos control sobre la presentación, el redibujado del valor, así que exigiría crear tu propio control. y prograsmar un evento 'Changed' (o ValueChanged), que es donde redibujamos el valor y con la ayuda de una propiedad "AjustarSiemprealTantoPorCiento" = TRUE
Como dudo que vayas a crear un control de usuario solo para eso, me remito a la solución sobre el progressbar...

- Puesto el control del 0 al 100: Supongamos que vas a leer 63147 bytes... desde un bucle,
Código:
   Float PorCiento1

    // pgbProgreso, aquíes un control ProgressBar
    pgbProgreso.Min = 0
    pgbProgreso.Max = 100 // en realidad solo llegaremos al 99, pero dejamos 1 más por si los decimales alcanzan el 100, para que no 'cante' error...

    PorCiento1 = (63147 / 100)
    Bucle para k desde 0 a 63146
       // cosas por hacer
       pgbProgreso.Value = (porciento1 * k)
       // otras cosas por hacer
    Fin Bucle

p.d.: No había visto la imagen (hasta enviar la respuesta) y que no usas un control progressbar, si no que muestras el resultado en un simple label... modifico el pseudocódigo previo:

Código:
   Float PorCiento1

    //lblProgreso, sería aquí un label
    PorCiento1 = (63147 / 100)
    Bucle para k desde 0 a 63146
       // cosas por hacer
       // Damos formato al valor para que tenga al menos 2 decimales.
       // OJO:
       //     La barra "\" es una división entera.
       //     INT es una función de conversión donde se elimina los decimales.
       //     ToString, no deja lugar a dudas....
       lblProgreso.Text = (Int((porciento1 * k) * 100) \ 100).ToString & "%"
       // otras cosas por hacer
    Fin Bucle
« Última modificación: 21 Agosto 2017, 14:00 por NEBIRE » En línea

Meta


Desconectado Desconectado

Mensajes: 2.997



Ver Perfil WWW
Re: Calcular porcentaje
« Respuesta #3 en: 21 Agosto 2017, 14:36 »

Buenas:

Pensaba que era algo así.
Código
  1. label_Por_ciento.Text = ((progressBar_barrra_progreso.Value / archivo.Count()) * 100).ToString() + "%";

Voy a probar lo que dices.

Saludos.
En línea

Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/
Meta


Desconectado Desconectado

Mensajes: 2.997



Ver Perfil WWW
Re: Calcular porcentaje
« Respuesta #4 en: 22 Agosto 2017, 01:38 »

Averiguado, gracias por la ayuda.

Código
  1.      // Variables.
  2.        bool alto = false;
  3.        int N = 0;
  4.        int P = 0;
  5.        int resul = 0;
  6.  
  7.        private void TestDoEvents()
  8.        {
  9.            // Carga el archivo en el array.
  10.            byte[] archivo = File.ReadAllBytes(textBox_ubicacion_archivo.Text);
  11.  
  12.            // Hasta donde llegue el tamaño del archivo.
  13.            progressBar_barrra_progreso.Maximum = archivo.Length;
  14.  
  15.            // Guarda la cantidad de Bytes del archivo en la variable.
  16.            N = archivo.Length - 1;
  17.  
  18.            // Transmite byte en byte los datos del archivo al puerto serie.
  19.            for (int i = 0; i <= archivo.GetUpperBound(0); i++)
  20.            {
  21.                // Enviando archivo al puerto serie.
  22.                serialPort1.Write(archivo, i, 1);
  23.  
  24.                // Números de Bytes.
  25.                P = i;
  26.  
  27.                // Resultado de la regla de tres. Cálculo del porcentaje de la barra de progreso.
  28.                resul = 100 * i / N;
  29.  
  30.                // Muestra barra del progreso.
  31.                progressBar_barrra_progreso.Value = i;
  32.  
  33.                // Muestra la cantidad de Bytes enviados.
  34.                label_Bytes_transmitidos.Text = i.ToString() + " Bytes.";
  35.  
  36.                // Muestra la cantidad en porciento archivo enviado.
  37.                label_Por_ciento.Text = resul + " %";
  38.  
  39.                // Evento de cancelación.
  40.                Application.DoEvents();
  41.                if (alto == true)
  42.                {
  43.                    alto = false;
  44.                    break; // TODO: might not be correct. Was : Exit For
  45.                }
  46.            }
  47.            button_Cancelar.Text = "Arranque";
  48.        }
  49.  
  50.        private void button_Cancelar_Click(object sender, EventArgs e)
  51.        {
  52.            if (button_Cancelar.Text == "Arranque")
  53.            {
  54.                button_Cancelar.Text = "Cancelar";
  55.                TestDoEvents();
  56.                progressBar_barrra_progreso.Value = 0; // Resetear progressBar a 0.
  57.                label_Bytes_transmitidos.Text = "0";
  58.            }
  59.            else
  60.            {
  61.                if (alto == true)
  62.                {
  63.                    alto = false;
  64.                }
  65.                else
  66.                {
  67.                    alto = true;
  68.                    button_Cancelar.Text = "Arranque";
  69.                }
  70.            }
  71.        }
En línea

Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/
Eleкtro
🌍 🕉️ 🛏️ Novato Astral 🛏️ 🕉️ 🌍 y...
Moderador Global
***
Desconectado Desconectado

Mensajes: 9.298


El sentido común es el menos común de los sentidos


Ver Perfil
Re: Calcular porcentaje
« Respuesta #5 en: 5 Septiembre 2017, 04:08 »

Código
  1. progressBar_barrra_progreso.Value = 0; // Resetear progressBar a 0.

Lo correcto, tanto por estética del código fuente, como por rendimiento y seguridad del producto final, sería utilizar el método ProgressBar.Increment:

Código
  1. progressBar1.Increment(1);

De esta forma evitarías futuros posibles errores humanos como sería por ejemplo:
Código
  1. progressBar1.Maximum = 100;
  2. progressBar1.Value = 101;
...Este código de arriba provocaría una excepción de tipo ArgumentOutOfRangeException, mientras que si usases el método ProgressBar.Increment podrías rebasar el valor máximo por accidente sin provocar ninguna excepción.

Ejemplo demostrativo:
Código
  1. progressBar1.Maximum = 100;
  2. for (int x = 0; x <= 999; x++) {
  3. progressBar1.Increment(1);
  4. }



Código
  1. Application.DoEvents();

No sé si habrás tenido la oportunidad de leer lo que programadores profesionales siempre han opinado sobre el método Application.DoEvents, pero todas las opiniones escritas en la World Wide Web se podrian resumir brevemente en las siguientes palabras: "Application.DoEvents() is EVIL, do not use it." - y quien dijo eso tuvo mucha razón. No debes utilizar dicho método a menos que seas consciente de lo que hace y como lo hace intérnamente, sé que es una via de escape facil para solventar la respuesta o responsiveness de la interfáz de usuario, pero es que esa metodología conlleva muchas desventajas, y a día de hoy es prehistórica. Lo único que te debería importar es lo siguiente: al lo único que consigues llamando a ese método de forma continua dentro de un búcle, es disminuir el rendimiento (la velocidad) de tu programa y el algoritmo de copiado, y no lo estás disminuyendo un poco, sino MUCHO ( puedes hacer la prueba por ti mismo con y sin llamar a Application.DoEvents() ).

( Aquí te dejo una opinión del gran gurú Hans Passant: https://stackoverflow.com/a/5183623/1248295 )

En lugar de utilizar el método Application.DoEvents(), puedes utilizar esto otro método:
...De esta manera, las llamadas continuas a Application.DoEvents() se disminuirán en consideración, y con ello aumentará bastante el rendimiento de tus algoritmos donde tengas que llamar a Application.DoEvents(). Y por supuesto al usar esta alternativa/mejora, la interfáz de usuario seguirá siendo responsiva a los eventos de notificación de Click.

...Pero mucho mejor y más correcto que utilizar Application.DoEvents(), que como ya dije ES UNA METODOLOGÍA PREHISTÓRICA (aparte de peligrosa), sería recurrir a los instrumentos que .NET Framework nos proporciona hoy en día, me refiero a la programación asincrónica, ni más, ni menos. Si necesitamos interactuar con los elementos de control de una UI, entonces lo más adecuado sería utilizar el componente BackgroundWorker, puesto que está precisamente diseñado para llevar a cabo la interactuactuación con la UI, pero podemos utilizar la classe Task, o Thread. También es importante utilizar los métodos Control.BeginInvoke / Control.Invoke según las circunstancias. Hay varias maneras de llevarlo a cabo, depende del escenario / circunstancias.

Por último, te muestro un pequeño ejemplo gráfico:

       

PD: Ahora que lo pienso mejor, debería haber escrito "responive UI" en lugar de "app" en la imagen, pero bueh. Si, ya sé que me preocupo por tonterías, soy así de exquisito o perfeccionista... según se mire xD.

Saludos.
« Última modificación: 5 Septiembre 2017, 04:10 por Eleкtro » En línea


[/cent
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Porcentaje de IVA
Hardware
Smaster77 4 4,692 Último mensaje 31 Agosto 2008, 10:30
por Smaster77
Sumar un porcentaje « 1 2 »
Programación C/C++
cazagavilan 12 4,140 Último mensaje 25 Julio 2011, 06:48
por cazagavilan
Calculo Porcentaje « 1 2 3 »
Dudas Generales
EuroHack 23 7,742 Último mensaje 27 Enero 2012, 07:50
por H1tchclock
porcentaje de uso de cpu
Scripting
navivan 6 2,479 Último mensaje 12 Marzo 2014, 18:07
por navivan
porcentaje en c
Programación C/C++
lucas59 2 1,666 Último mensaje 5 Octubre 2014, 13:36
por eferion
Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines