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

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Ayuda con progresBar c#!!!
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Ayuda con progresBar c#!!!  (Leído 8,980 veces)
Hartigan


Desconectado Desconectado

Mensajes: 310


Ver Perfil
Ayuda con progresBar c#!!!
« en: 29 Julio 2010, 17:31 pm »

HOla, esto no es para mi, sino para mi hermano: os pong lo que me ha puesto:


Estoy intentando hacer una aplicación de escritorio que al ejecutarla, lo primero que hace es establecer conexión con la fuente de datos, que no es mas que una comprobación de que la fuente de datos existe o esta accesible para que la aplicación funcione correctamente. La interfaz que hace dixa operación es la siguiente:



Lo que quiero es que el progressbar vaya sincronizado con las operaciones que se realizan, y que termine de cargarse justo cuando el acceso a la fuente de datos se a completado… El código es el siguiente:

Código
  1. public partial class Interfaz_Conectar : Form
  2.    {
  3.        /* Delegados */
  4.        public delegate void Delegado_Conectar();
  5.        private delegate void Avanzar_progreso();
  6.        private delegate void Detener_progreso();
  7.        private delegate void Cerrar();
  8.  
  9.  
  10.        /* Eventos */
  11.        public event Delegado_Conectar Conectar;
  12.        public event Delegado_Conectar noConectar;
  13.  
  14.  
  15.        /* Proceso de segundo plano */
  16.        private BackgroundWorker bw = new BackgroundWorker();
  17.        private BackgroundWorker avanzar = new BackgroundWorker();
  18.  
  19.        /* Factoria */
  20.        private Factoria_DAO factoria;
  21.  
  22.        /* Para finaliar el progreso de la ProgressBar */
  23.        private bool finalizar = false;
  24.        private bool exito = false;
  25.  
  26.  
  27.        public Interfaz_Conectar(Factoria_DAO _factoria)
  28.        {
  29.            InitializeComponent();
  30.            factoria = _factoria;
  31.        }
  32.  
  33.        /* Evento que tiene lugar cuando se muestra el formulario por primera vez */
  34.        private void Interfaz_Conectar_Shown(object sender, EventArgs e)
  35.        {
  36.            bw.WorkerReportsProgress = true;
  37.            bw.WorkerSupportsCancellation = true;
  38.            bw.DoWork += new DoWorkEventHandler(bw_DoWork);
  39.            bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
  40.  
  41.  
  42.            avanzar.WorkerReportsProgress = true;
  43.            avanzar.WorkerSupportsCancellation = true;
  44.            avanzar.DoWork += new DoWorkEventHandler(avanzar_DoWork);
  45.            //avanzar.RunWorkerCompleted += new RunWorkerCompletedEventHandler(avanzar_RunWorkerCompleted);
  46.  
  47.  
  48.  
  49.            /* Se incia la operacion en segundo plano */
  50.            avanzar.RunWorkerAsync();
  51.  
  52.            /* Se inicia la operacion en segundo plano */
  53.            bw.RunWorkerAsync();
  54.  
  55.  
  56.        }
  57.  
  58.        private void bw_DoWork(object sender, DoWorkEventArgs e)
  59.        {
  60.            Gestion_Conectividad gconectividad = new Gestion_Conectividad();
  61.            if (gconectividad.Comprobar_conectividad(factoria))
  62.            {
  63.                exito = true;
  64.                finalizar = true;
  65.                if (Conectar != null)
  66.                    Conectar();
  67.            }
  68.            else
  69.            {
  70.                exito = false;
  71.                finalizar = true;
  72.                if (noConectar != null)
  73.                    noConectar();
  74.            }
  75.        }
  76.  
  77.  
  78.        private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
  79.        {
  80.            if (this.InvokeRequired == true)
  81.            {
  82.                Cerrar cerrar = new Cerrar(this.Cerrar_form);
  83.                this.Invoke(cerrar);
  84.            }
  85.            else
  86.            {
  87.                this.Cerrar_form();
  88.            }
  89.        }
  90.  
  91.        private void avanzar_DoWork(object sender, DoWorkEventArgs e)
  92.        {
  93.            if (this.progressBarConectar.InvokeRequired == true)
  94.            {
  95.                Avanzar_progreso aprogreso = new Avanzar_progreso(this.avanzar_Progreso);
  96.                this.progressBarConectar.Invoke(aprogreso);
  97.            }
  98.            else
  99.            {
  100.                this.avanzar_Progreso();
  101.            }
  102.  
  103.            if (this.InvokeRequired == true)
  104.            {
  105.                Detener_progreso dprogreso = new Detener_progreso(this.detener);
  106.                this.Invoke(dprogreso);
  107.  
  108.            }
  109.            else
  110.            {
  111.                this.detener();
  112.            }
  113.  
  114.        }
  115.  
  116.        private void avanzar_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
  117.        {
  118.            if (this.progressBarConectar.InvokeRequired == true)
  119.            {
  120.                Detener_progreso dprogreso = new Detener_progreso(this.detener);
  121.                this.progressBarConectar.Invoke(dprogreso);
  122.  
  123.            }
  124.            else
  125.            {
  126.                this.detener();
  127.            }
  128.        }
  129.  
  130.        private void avanzar_Progreso()
  131.        {
  132.            for (int i = this.progressBarConectar.Minimum; i <= this.progressBarConectar.Maximum; i++)
  133.            {
  134.                if (finalizar == false)
  135.                {
  136.                    this.progressBarConectar.PerformStep();
  137.                }
  138.                else
  139.                {
  140.                    i = this.progressBarConectar.Maximum;
  141.                }
  142.                System.Threading.Thread.Sleep(50);
  143.            }
  144.  
  145.        }
  146.  
  147.        private void detener()
  148.        {
  149.            if (exito)
  150.                this.progressBarConectar.Value = this.progressBarConectar.Maximum;
  151.  
  152.        }
  153.  
  154.        private void Cerrar_form()
  155.        {
  156.            this.Close();
  157.        }
  158.    }
  159.  

En resumen lo que hago es crear dos subprcesos que se ejecutan en segundo plano, uno en el que se realizan las operaciones de acceso a la fuente de datos (factoria, es porque utlizo factoria abstracta junto con el patron DAO, factoria de DAO’s) y el otro subproceso es el encargado de la barra de progreso. Lo unico que hago en la barra de progereso es un Sleep del hilo y que continue cargando, y asi sucesivamente, pero obiamnete eso no v a ir sincronizado con el otro subproceso, porque no hay nada que le vaya diciendo el progeso que lleva en las operaciones de acceso a la fuente de datos…
No se si me explico, de todas formas sino queda claro, explicare lo que haga falta y os asgradeczo en todo lo que me podais ayudar para conseguir hacerlo.

Gracias a todos.

pues eso, a ver si teneis alguna solución. Saludos ;)



En línea

[D4N93R]
Wiki

Desconectado Desconectado

Mensajes: 1.646


My software never has bugs. Its just features!


Ver Perfil WWW
Re: Ayuda con progresBar c#!!!
« Respuesta #1 en: 29 Julio 2010, 18:45 pm »

No entiendo bien, el problema que tienes es que no puedes sincronizar el hilo que va evaluando la base de datos con el ProgressBar? Bueno, con respecto al tema, no hace falta dos Hilos, uno solo es suficiente.

Luego entonces, te puede dar problemas ya que no puedes comunicarte con controles desde un subproceso, por lo que tendrías que hacer un invoke al hilo del formulario y pasarle un delegado que apunte al método que actualiza el ProgressBar.

Me gustaría también que corrigieras un poco tu nomenclatura, Te recomiendo que programes en inglés, ya que sería un solo lenguaje, se ve como raro New Cliente, es mejor New Client por ejemplo..

Bueno, espero me respondas y me digas bien cual es el problema.

Saludos!


En línea

Hartigan


Desconectado Desconectado

Mensajes: 310


Ver Perfil
Re: Ayuda con progresBar c#!!!
« Respuesta #2 en: 30 Julio 2010, 01:11 am »

Exacto, el problema esque no puedo sincronizarlos, el hilo que va evaluando la base de datos y realizando la conexion con esta, con el hilo del progressbar...

Como podria hacerlo con un solo hilo??
No entiendo muy bien lo que dices...

Gracias por la respuesta
En línea

[D4N93R]
Wiki

Desconectado Desconectado

Mensajes: 1.646


My software never has bugs. Its just features!


Ver Perfil WWW
Re: Ayuda con progresBar c#!!!
« Respuesta #3 en: 30 Julio 2010, 03:46 am »

El método dowork del backgroundworker es el que va a hacer todo, no hace falta dos hilos, ni sincronizarlos, hazlo todo en el mismo método..
En línea

43H4FH44H45H4CH49H56H45H
Wiki

Desconectado Desconectado

Mensajes: 502



Ver Perfil
Re: Ayuda con progresBar c#!!!
« Respuesta #4 en: 31 Julio 2010, 04:41 am »

Exacto, el problema esque no puedo sincronizarlos, el hilo que va evaluando la base de datos y realizando la conexion con esta, con el hilo del progressbar...

Como podria hacerlo con un solo hilo??


De pasada (ya que es viernes  ;D) mira este ejemplo:

Código
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. using System.IO;
  10. using System.Threading;
  11.  
  12. namespace WindowsFormsApplication1
  13. {
  14.    public partial class Form1 : Form
  15.    {
  16.        Thread myThread;
  17.        delegate void SetValueCallback(int valor);
  18.  
  19.        public Form1()
  20.        {
  21.            InitializeComponent();
  22.        }
  23.  
  24.        private void button1_Click(object sender, EventArgs e)
  25.        {
  26.            myThread = new Thread(new ThreadStart(listar));
  27.            myThread.Start();
  28.        }
  29.        private void Form1_Load(object sender, EventArgs e)
  30.        {
  31.            progressBar1.Minimum = 0;
  32.        }
  33.        private void listar()
  34.        {
  35.            int i = 0;
  36.            DirectoryInfo dInfo = new DirectoryInfo(@"C:\Windows\");
  37.            FileInfo[] finfo = dInfo.GetFiles("*.*", SearchOption.AllDirectories);
  38.            this.SetMax(finfo.Length);
  39.            foreach (FileInfo f in finfo)
  40.            {
  41.                this.SetValue(i += 1);
  42.                System.Threading.Thread.Sleep(50);
  43.            }
  44.        }
  45.        private void SetValue(int valor)
  46.        {
  47.            if (this.InvokeRequired)
  48.            {
  49.                SetValueCallback d = new SetValueCallback(SetValue);
  50.                this.Invoke(d, new object[] { valor });
  51.            }
  52.            else
  53.            {
  54.                this.progressBar1.Value = valor;
  55.            }
  56.        }
  57.        private void SetMax(int valor)
  58.        {
  59.            if (this.InvokeRequired)
  60.            {
  61.                SetValueCallback d = new SetValueCallback(SetMax);
  62.                this.Invoke(d, new object[] { valor });
  63.            }
  64.            else
  65.            {
  66.                this.progressBar1.Maximum = valor;
  67.            }
  68.        }
  69.    }
  70. }
  71.  

Lista una carpeta, luego el número de archivos en la misma pasa a ser el valor máximo del PB, por último va recorriendo cada archivo de la carpeta y al hacerlo va cambiando el valor del PB hasta llegar al máximo.

Puedes modificarlo y mejorarlo para lo que necesitas.
En línea


-R IP
:0100
-A 100 
2826:0100 MOV AH,09
2826:0102 MOV DX,109
2826:0105 INT 21
2826:0105 MOV AH,08
2826:0105 INT 21
2826:0107 INT 20
2826:0109 DB 'MI NICK ES CODELIVE.$' 
2826:0127 
-R BX
:0000
-R CX
:20
-N CODELIVE.COM
-W
Hartigan


Desconectado Desconectado

Mensajes: 310


Ver Perfil
Re: Ayuda con progresBar c#!!!
« Respuesta #5 en: 31 Julio 2010, 13:25 pm »

Muchas gracias! Ahora ya se hacerlo!
Solo tengo un pequeño problema, y esuqe para establecer el valor maximo del progressbar necesito cuantificar el tiempo que tarda el subproceso en acceder a la base de datos... como puedo hacerlo??

El subproceso no hace mas que esto:

Código
  1. public override bool Comprobar_conexion(string database)
  2.        {
  3.            /* Exito */
  4.            bool conectado = false;
  5.  
  6.            /* Sentencia Sql */
  7.            String querySel = "EXEC sp_databases";
  8.  
  9.            /* Conexion con la base de datos */
  10.            SqlConnection cnn = null;
  11.  
  12.            try
  13.            {
  14.                /* Conexion */
  15.                cnn = new SqlConnection(cadena_conexion);
  16.                SqlDataAdapter da = new SqlDataAdapter(querySel, cnn);
  17.  
  18.                /* Se almacenan los datos obtenidos en el DataTable */
  19.                DataTable dt = new DataTable();
  20.                cnn.Open();
  21.                da.Fill(dt);
  22.                cnn.Close();
  23.  
  24.                /* Se busca la base de datos que queremos conectar */
  25.                for (int i = 0; i < dt.Rows.Count; i++)
  26.                {
  27.                    if (dt.Rows[i][0].ToString() == database)
  28.                        conectado = true;                        
  29.  
  30.                }
  31.  
  32.            }
  33.            catch (SqlException ex)
  34.            {
  35.                MessageBox.Show("ERROR al conectar con la base de datos:\n" + ex.Message, "Conexion", MessageBoxButtons.OK, MessageBoxIcon.Error);
  36.                conectado = false;
  37.            }
  38.            finally
  39.            {
  40.                if (cnn != null)
  41.                {
  42.                    if (cnn.State == ConnectionState.Open)
  43.                        cnn.Close();
  44.                }
  45.            }
  46.            return (conectado);
  47.        }
En línea

[D4N93R]
Wiki

Desconectado Desconectado

Mensajes: 1.646


My software never has bugs. Its just features!


Ver Perfil WWW
Re: Ayuda con progresBar c#!!!
« Respuesta #6 en: 31 Julio 2010, 16:42 pm »

Citar
cuantificar el tiempo que tarda el subproceso en acceder a la base de datos

Para que haces eso? Solamente toma la conexión a la base de datos como un step más del progressbar..

Saludos!
En línea

43H4FH44H45H4CH49H56H45H
Wiki

Desconectado Desconectado

Mensajes: 502



Ver Perfil
Re: Ayuda con progresBar c#!!!
« Respuesta #7 en: 31 Julio 2010, 18:28 pm »

Solo tengo un pequeño problema, y esuqe para establecer el valor maximo del progressbar necesito cuantificar el tiempo que tarda el subproceso en acceder a la base de datos... como puedo hacerlo??

Podrias hacer que mientras el hilo este activo vaya subiendo el valor del PB y una vez que acabe el PB tome su valor maximo (no importa el numero maximo, solo depende cuanto aumenta el value en cada cierto tiempo).
Si lo haces de ese modo podrias tener un rango de tiempo de espera para la conexion, si no logra conectarse anulas el proceso.

En otro caso, podrias dividir el maximo del PB entre cada linea de tu code y tb para el for.
Bueno hay mas modos, pero creo que es lo que buscas.
En línea


-R IP
:0100
-A 100 
2826:0100 MOV AH,09
2826:0102 MOV DX,109
2826:0105 INT 21
2826:0105 MOV AH,08
2826:0105 INT 21
2826:0107 INT 20
2826:0109 DB 'MI NICK ES CODELIVE.$' 
2826:0127 
-R BX
:0000
-R CX
:20
-N CODELIVE.COM
-W
Hartigan


Desconectado Desconectado

Mensajes: 310


Ver Perfil
Re: Ayuda con progresBar c#!!!
« Respuesta #8 en: 31 Julio 2010, 19:14 pm »

Vale, gracias a los dos! He modificado un poco el codigo, segun lo que me habeis dixo, aunque no tengo muy claras las ideas, pero os pongo el codigo a ver si voy bien encaminado...

Código
  1. public partial class Interfaz_Conectar : Form
  2.    {
  3.        /* Delegados */
  4.        public delegate void Delegado_Conectar();
  5.        private delegate void Detener_progreso();
  6.        private delegate void Cerrar();
  7.  
  8.  
  9.        /* Eventos */
  10.        public event Delegado_Conectar Conectar;
  11.        public event Delegado_Conectar noConectar;
  12.  
  13.  
  14.        /* Proceso de segundo plano */
  15.        private BackgroundWorker bw = new BackgroundWorker();
  16.  
  17.        /* Factoria */
  18.        private Factoria_DAO factoria;
  19.  
  20.        public Interfaz_Conectar(Factoria_DAO _factoria)
  21.        {
  22.            InitializeComponent();
  23.            this.factoria = _factoria;
  24.        }
  25.  
  26.        /* Evento que tiene lugar cuando se muestra el formulario por primera vez */
  27.        private void Interfaz_Conectar_Shown(object sender, EventArgs e)
  28.        {
  29.            bw.WorkerReportsProgress = true;
  30.            bw.WorkerSupportsCancellation = true;
  31.            bw.WorkerReportsProgress = true;
  32.            bw.DoWork += new DoWorkEventHandler(bw_DoWork);
  33.            bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
  34.            bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
  35.  
  36.            if (bw.IsBusy != true)
  37.            {
  38.                /* Se inicia la operacion en segundo plano */
  39.                bw.RunWorkerAsync();
  40.            }
  41.  
  42.        }
  43.  
  44.        private void bw_DoWork(object sender, DoWorkEventArgs e)
  45.        {
  46.            BackgroundWorker worker = sender as BackgroundWorker;
  47.  
  48.            int contador = this.progressBarConectar.Minimum;
  49.  
  50.            while (worker.CancellationPending != true)
  51.            {
  52.                if (worker.CancellationPending == true)
  53.                {
  54.                    e.Cancel = true;
  55.                    break;
  56.                }
  57.                else
  58.                {
  59.                    Gestion_Conectividad gconectividad = new Gestion_Conectividad();
  60.                    if (gconectividad.Comprobar_conectividad(factoria))
  61.                    {
  62.                        if (Conectar != null)
  63.                            Conectar();
  64.                    }
  65.                    else
  66.                    {
  67.                        if (noConectar != null)
  68.                            noConectar();
  69.                    }
  70.                    contador++;
  71.                    System.Threading.Thread.Sleep(100);
  72.                    worker.ReportProgress(/* ¿ que valor le paso? */ contador);
  73.  
  74.                }
  75.            }
  76.        }
  77.  
  78.  
  79.        private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
  80.        {
  81.            if (!(e.Error == null))
  82.            {
  83.                if (noConectar != null)
  84.                    noConectar();
  85.            }
  86.            else
  87.            {
  88.                this.progressBarConectar.Value = this.progressBarConectar.Maximum;
  89.                if (this.InvokeRequired == true)
  90.                {
  91.                    Cerrar cerrar = new Cerrar(this.Cerrar_form);
  92.                    this.Invoke(cerrar);
  93.                }
  94.                else
  95.                {
  96.                    this.Cerrar_form();
  97.                }
  98.            }        
  99.        }
  100.  
  101.        private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
  102.        {
  103.            progressBarConectar.Value = e.ProgressPercentage;
  104.  
  105.        }
  106.  
  107.  
  108.        private void Cerrar_form()
  109.        {
  110.            this.Close();
  111.        }
  112.    }


Primer problema: 
Código
  1. Gestion_Conectividad gconectividad = new Gestion_Conectividad();
  2.                    if (gconectividad.Comprobar_conectividad(factoria))
  3.                    {
  4.                        if (Conectar != null)
  5.                            Conectar();
  6.                    }
  7.                    else
  8.                    {
  9.                        if (noConectar != null)
  10.                            noConectar();
  11.                    }
No se como meter este trozo de codigo que es el que inicia las operaciones hacia la base de datos, y de manera paralela un bucle que haga un Sleep y el incremento del valor del PB...
Porque lo que yo tengo puesto ahora, es un bucle "estupido" que realiza un monton de veces la misma operacion a la base de datos xD

Gracias a los dos por las respuestas..
En línea

Hartigan


Desconectado Desconectado

Mensajes: 310


Ver Perfil
Re: Ayuda con progresBar c#!!!
« Respuesta #9 en: 2 Agosto 2010, 20:44 pm »

Bueno, al final he decidido que es mejor poner un ProgressBar con el Style Marquee, pues creo que es mas logico...

Pero con el nuevo codigo sigo teniendo problemas... y es que no se muestra el progreso, es decir, no se carga la barrita, no
He leido webs y mas webs, codigos y codigos... y en todas partes pone que lo unico que hay que acer para hacer un que empiece el Progress Bar es establecer el ProgressBarSytle a marquee, y el MarqueeAnimatinSpeed al valor que se quiera, ademas de tener Application.EnableVisualStyles()...

El codigo:

-- Con un solo subproceso en segundo plano:

Código
  1. public partial class Interfaz_Conectar : Form
  2.    {
  3.        /* Delegados */
  4.        public delegate void Delegado_Conectar();
  5.        private delegate void Cerrar();
  6.        private delegate void Animar_ProgressBar();
  7.  
  8.        /* Eventos */
  9.        public event Delegado_Conectar Conectar;
  10.        public event Delegado_Conectar noConectar;
  11.  
  12.  
  13.        /* Proceso de segundo plano */
  14.        private BackgroundWorker bw = new BackgroundWorker();
  15.  
  16.        /* Factoria */
  17.        private Factoria_DAO factoria;
  18.  
  19.        public Interfaz_Conectar(Factoria_DAO _factoria)
  20.        {
  21.            InitializeComponent();
  22.            this.factoria = _factoria;
  23.  
  24.        }
  25.  
  26.        /* Evento que tiene lugar cuando se muestra el formulario por primera vez */
  27.        private void Interfaz_Conectar_Shown(object sender, EventArgs e)
  28.        {
  29.  
  30.  
  31.            bw.WorkerReportsProgress = true;
  32.            bw.WorkerSupportsCancellation = true;
  33.            bw.DoWork += new DoWorkEventHandler(bw_DoWork);
  34.            bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
  35.  
  36.  
  37.            if (bw.IsBusy != true)
  38.            {
  39.                /* Se inicia la operacion en segundo plano */
  40.                bw.RunWorkerAsync();
  41.            }
  42.  
  43.        }
  44.  
  45.        private void bw_DoWork(object sender, DoWorkEventArgs e)
  46.        {
  47.            BackgroundWorker worker = sender as BackgroundWorker;
  48.  
  49.            if (worker.CancellationPending == true)
  50.            {
  51.                e.Cancel = true;
  52.            }
  53.            else
  54.            {
  55.  
  56.                // Llamada segura desde el  para animar el progressBar
  57.                if (this.InvokeRequired == true)
  58.                {
  59.                    Animar_ProgressBar animarPb = new                    Animar_ProgressBar(this.animarProgressBar);
  60.                    this.Invoke(animarPb);
  61.                }
  62.                else
  63.                {
  64.                    this.animarProgressBar();
  65.                }
  66.  
  67.                // Operaciones que realiza el subpreceso (conexcion con al base de datos)
  68.                Gestion_Conectividad gconectividad = new Gestion_Conectividad();
  69.                System.Threading.Thread.Sleep(100);
  70.                if (gconectividad.Comprobar_conectividad(factoria))
  71.                {
  72.                    if (Conectar != null)
  73.                         Conectar();
  74.                }
  75.                else
  76.                {
  77.                    if (noConectar != null)
  78.                        noConectar();
  79.                }
  80.            }
  81.        }
  82.  
  83.  
  84.        private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
  85.        {
  86.            if (!(e.Error == null))
  87.            {
  88.                if (noConectar != null)
  89.                    noConectar();
  90.            }
  91.            else
  92.            {
  93.                if (this.InvokeRequired == true)
  94.                {
  95.  
  96.  
  97.                    Cerrar cerrar = new Cerrar(this.Cerrar_form);
  98.                    this.Invoke(cerrar);
  99.                }
  100.                else
  101.                {
  102.                    this.Cerrar_form();
  103.                }
  104.            }        
  105.        }
  106.  
  107.        private void animarProgressBar()
  108.        {
  109.                this.progressBarConectar.Style = ProgressBarStyle.Marquee;
  110.                this.progressBarConectar.MarqueeAnimationSpeed = 100;
  111.  
  112.            }
  113.        }
  114.  
  115.        private void Cerrar_form()
  116.        {
  117.            // Se detiene el progressBar y se cierra el form
  118.            this.progressBarConectar.Style = ProgressBarStyle.Blocks;
  119.            this.progressBarConectar.MarqueeAnimationSpeed = 0;
  120.            this.Close();
  121.        }
  122.    }


-- CON DOS SUBPROCESOS COMO SOLUCION PARA LLAMAR EN UN BUCLE A "APPLICATION.DOEVENTS()"

Código
  1.    public partial class Interfaz_Conectar : Form
  2.    {
  3.        /* Delegados */
  4.        public delegate void Delegado_Conectar();
  5.        private delegate void Cerrar();
  6.        private delegate void Animar_ProgressBar();
  7.  
  8.        /* Eventos */
  9.        public event Delegado_Conectar Conectar;
  10.        public event Delegado_Conectar noConectar;
  11.  
  12.  
  13.        /* Proceso de segundo plano */
  14.        private BackgroundWorker bw = new BackgroundWorker();
  15.        private BackgroundWorker bwProgressBar = new BackgroundWorker();
  16.  
  17.        /* Factoria */
  18.        private Factoria_DAO factoria;
  19.  
  20.        public Interfaz_Conectar(Factoria_DAO _factoria)
  21.        {
  22.            InitializeComponent();
  23.            this.factoria = _factoria;
  24.  
  25.        }
  26.  
  27.        /* Evento que tiene lugar cuando se muestra el formulario por primera vez */
  28.        private void Interfaz_Conectar_Shown(object sender, EventArgs e)
  29.        {
  30.  
  31.  
  32.            bwProgressBar.WorkerReportsProgress = true;
  33.            bwProgressBar.WorkerSupportsCancellation = true;
  34.            bwProgressBar.DoWork += new DoWorkEventHandler(bwProgressBar_DoWork);
  35.            bwProgressBar.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bwProgressBar_RunWorkerCompleted);
  36.  
  37.  
  38.            bw.WorkerReportsProgress = true;
  39.            bw.WorkerSupportsCancellation = true;
  40.            bw.DoWork += new DoWorkEventHandler(bw_DoWork);
  41.            bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
  42.  
  43.            if (bwProgressBar.IsBusy != true)
  44.            {
  45.                bwProgressBar.RunWorkerAsync();
  46.            }
  47.  
  48.            if (bw.IsBusy != true)
  49.            {
  50.                /* Se inicia la operacion en segundo plano */
  51.                bw.RunWorkerAsync();
  52.            }
  53.  
  54.        }
  55.  
  56.        private void bwProgressBar_DoWork(object sender, DoWorkEventArgs e)
  57.        {
  58.            BackgroundWorker worker = sender as BackgroundWorker;
  59.  
  60.            if (worker.CancellationPending)
  61.            {
  62.                e.Cancel = true;
  63.            }
  64.            else
  65.            {
  66.                if (this.InvokeRequired == true)
  67.                {
  68.                    Animar_ProgressBar animarPb = new Animar_ProgressBar(this.animarProgressBar);
  69.                    this.Invoke(animarPb);
  70.                }
  71.                else
  72.                {
  73.                    this.animarProgressBar();
  74.                }
  75.  
  76.            }
  77.        }
  78.  
  79.        private void bwProgressBar_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
  80.        {
  81.            if (!(e.Error == null))
  82.            {
  83.                if (noConectar != null)
  84.                    noConectar();
  85.            }
  86.            else
  87.            {
  88.                this.progressBarConectar.Style = ProgressBarStyle.Blocks;
  89.                this.progressBarConectar.MarqueeAnimationSpeed = 0;
  90.            }
  91.        }
  92.  
  93.        private void bw_DoWork(object sender, DoWorkEventArgs e)
  94.        {
  95.            BackgroundWorker worker = sender as BackgroundWorker;
  96.  
  97.            if (worker.CancellationPending == true)
  98.            {
  99.                e.Cancel = true;
  100.            }
  101.            else
  102.            {
  103.  
  104.                Gestion_Conectividad gconectividad = new Gestion_Conectividad();
  105.                System.Threading.Thread.Sleep(1000);
  106.                if (gconectividad.Comprobar_conectividad(factoria))
  107.                {
  108.                    if (Conectar != null)
  109.                         Conectar();
  110.                }
  111.                else
  112.                {
  113.                    if (noConectar != null)
  114.                        noConectar();
  115.                }
  116.            }
  117.        }
  118.  
  119.  
  120.        private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
  121.        {
  122.            if (!(e.Error == null))
  123.            {
  124.                if (noConectar != null)
  125.                    noConectar();
  126.            }
  127.            else
  128.            {
  129.                if (this.InvokeRequired == true)
  130.                {
  131.                    Cerrar cerrar = new Cerrar(this.Cerrar_form);
  132.                    this.Invoke(cerrar);
  133.                }
  134.                else
  135.                {
  136.                    this.Cerrar_form();
  137.                }
  138.            }        
  139.        }
  140.  
  141.        private void animarProgressBar()
  142.        {
  143.            Boolean animar = true;
  144.            if (animar)
  145.            {
  146.                this.progressBarConectar.Style = ProgressBarStyle.Marquee;
  147.                this.progressBarConectar.MarqueeAnimationSpeed = 100;
  148.  
  149.                while (!this.bwProgressBar.CancellationPending)
  150.                {
  151.                    Application.DoEvents();
  152.  
  153.                }
  154.            }
  155.        }
  156.  
  157.        private void Cerrar_form()
  158.        {
  159.            this.bwProgressBar.CancelAsync();
  160.            this.Close();
  161.        }
  162.    }


Ayuda plz, no consigo que funcionee de ninguna de las dos maneras ...

Gracias
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Progresbar sin que titile la pantalla
Scripting
pssnelgj 0 1,707 Último mensaje 12 Mayo 2012, 02:29 am
por pssnelgj
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines