Tengo un método que muestra cuando una barra de proceso que está en ejecución y cuando se ha completado correctamente.

Me funcionaba bien, pero me gustaría añadir un porcentaje que muestra un 100% si es completa y menos si se ha quedado atascado en algún lugar.

He hecho varias líneas de investigación en línea, pero no pude adaptar nada a la solución que estoy buscando.

Este es mi código:

private void progressBar()
{
    int i;

    progressBar1.Minimum = 0;
    progressBar1.Maximum = 100;

    for (i = 0; i <= 100; i++)
    {
        progressBar1.Value = i;               
    }
}

Yo uso el método de llamada en mi ejecución botón llamando con el seguimiento:

progressBar();

Gracias

  • Sin la actualización de la interfaz de usuario o de hacer alguna operación de larga duración, su for-loop es innecesaria y sólo podría escribir progressBar1.Value = 100, que probablemente sería lo que está optimizado para el uso en modo de lanzamiento.
  • También, estoy asumiendo que este es un proyecto winforms? Son ganas de añadir una etiqueta a un lugar que también muestra la misma barra de progreso de valor?
  • Gracias por la respuesta. De hecho, me han cambiado la primera sugerencia y está a la derecha del bucle for es innecesario. El segundo es un Formulario de Windows y me gustaría también agregar una etiqueta en la barra de progreso de valor. Gracias
  • intente utilizar progressBar1.CreateGraphics().Cordón de ajuste(configuraciones)
  • gracias a que estaban en lo correcto. Voy a presentar mi solución. Funcionó
  • esta aplicación está mal, ¿Cómo sabes que la tarea se realiza cuando i = 100?

InformationsquelleAutor A arancibia | 2015-11-19

3 Comentarios

  1. 1

    He ajustar el prograssBar método con las siguientes líneas.

    Funciona la solución.

    Gracias

    int percent = (int)(((double)progressBar1.Value / (double)progressBar1.Maximum) * 100);
                progressBar1.Refresh();
                progressBar1.CreateGraphics().DrawString(percent.ToString() + "%",
                    new Font("Arial", (float)8.25, FontStyle.Regular),
                    Brushes.Black,
                    new PointF(progressBar1.Width / 2 - 10, progressBar1.Height / 2 - 7));
    • Que sólo las actualizaciones de la barra de progreso, el resto de su forma, sería bloque
    • puede usted por favor me señale cómo hacer los cambios de acuerdo a sus sugerencias?. Gracias
    • ¿Cuál es su principal tarea? estás haciendo en otro hilo?
    • Tengo otro método que es importar datos a una base de datos En la final del método main que yo quería para indicar el progreso de la barra de estado
  2. 0

    Con el fin de implementar el progreso en su operación, la operación de la longitud se debe calcular primero. si no es posible, no se puede mostrar una barra de progreso de la operación. (tal vez sólo una carga gif)

    pero si es así, Hay una interfaz (IProgress) que pueden ayudar a implementar los informes de progreso.

    Primera cosa que usted debe saber, debe hacer la tarea principal en otro hilo, y el informe de progreso para el Subproceso de interfaz de usuario. un ejemplo sencillo de este trabajo sería algo como esto.

    Progreso.cs

    public class Progress<T> : IProgress<T>
    {
        private readonly Action<T> _progressAction;
    
        public Progress(Action<T> action)
        {
            _progressAction = action;
        }
    
        public void Report(T value)
        {
            _progressAction?.Invoke(value);
        }
    }

    El código sería como este, en el que la tarea empieza después de hacer clic en un botón denominado ButtonBase

    Progress<int> MyProgressObject { get; set; }
    
    private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
    {
        MyProgressObject = new Progress<int>(ProgressAction);
        ThreadPool.QueueUserWorkItem(TimeConsumingTask);
    }
    
    public void TimeConsumingTask(object state)
    {
        for (int i = 0; i < 100; i++)
        {
            Thread.Sleep(100);
            MyProgressBar.Dispatcher.Invoke(() => ProgressAction(i));
        }
    }
    
    public void ProgressAction(int progress)
    {
        MyProgressBar.Value = progress;
    }

    Sé que puede parecer difícil, pero esta es la manera correcta de hacer las tareas que consumen tiempo y evitar la interfaz de usuario bloque

  3. 0

    Si usted la utiliza como parte de backgroundworker funciona perfectamente
    He añadido una Etiqueta en el medio de la progressbar

    Y he añadido la última fila en mi bgw_ProgressChanged método

        private void bgw_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            p_bar.Value = e.ProgressPercentage;
            fnameLbl.Text = e.UserState.ToString();
            percentLbl.Text = "%" + (e.ProgressPercentage).ToString();
        }

    ProgressPercentagevalue viene desde el siguiente método

            foreach (var item in filebox1)
            {
                System.IO.File.Move(item, Path.Combine(destdir, Path.GetFileName(item)));
                ++counter;
                int tmp = (int)((counter* 100) / totfiles);
                bgw.ReportProgress(tmp, "File transfered : " + Path.GetFileName(item));
                Thread.Sleep(100);
            }

    Totfiles es el número de archivos que tengo de servidor.

    Hilo.Sleep(100) vamos a ver por un corto tiempo lo que se muestra con fnameLbl.Texto

Dejar respuesta

Please enter your comment!
Please enter your name here