CLR: .Net / Mono / Boo / Otros CLR > C#

 Editar un WindowsForm desde un sub-proceso(thread)

(1/1)

U2_Caparzo:
Hola a todos, mientras hacia una aplicacion, en la cual agrego controles dinamicamente por asi decirlo, la aplicacion se congelaba y cerraba, asi que puse el metodo en un thread, pero al hacer eso me dio el siguiente error

Operación no válida a través de subprocesos: Se tuvo acceso al control 'Form2' desde un subproceso distinto a aquel en que lo creó.

luego de investigar un poco encontre esta solucion, quizas muchos de ustedes lo hallaran basico o inutil, pero me sirvio bastante.

Asi es como dara el error

--- Código: ---    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }
        delegate void crearBoton();
        private void Form2_Load(object sender, EventArgs e)
        {
            Thread T = new Thread(new ThreadStart(NuevoBoton));
            T.Start();
        }
        private void NuevoBoton()
        {
            Button B = new Button();
            this.Controls.Add(B);
        }
    }

--- Fin del código ---

para hacerlo agregaremos un delegate void dentro de la clase Form2, ver si el Forn2 necesita invocacion, y si lo necesita invocar la clase pasando nuestro delegate como parametro.


--- Código: ---public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }
        delegate void crearBoton();
        private void Form2_Load(object sender, EventArgs e)
        {
            Thread T = new Thread(new ThreadStart(NuevoBoton));
            T.Start();
        }
        private void NuevoBoton()
        {
            if (this.InvokeRequired)
            {
                crearBoton CB = new crearBoton(NuevoBoton);//Creamos una instancia del delegate
                                      //pasandole el metodo que estamos ejecutando como parametro
                this.Invoke(CB);  //invocamos el Form pasando el delegate void que recien creamos
            }
            else
            {
                Button B = new Button();
                this.Controls.Add(B);
            }
        }
    }

--- Fin del código ---

espero que a alguien le sirva  :suerte:

.net:
Una solucion buena pero poco usada es agregar una linea en el load del formulario:

 CheckForIllegalCrossThreadCalls = true or false;

Yo no la recomiendo, pero es bueno saber

una buena practica es que recomienda el mensaje anterior


--- Código: ---public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }
        delegate void crearBoton();
        private void Form2_Load(object sender, EventArgs e)
        {
            Thread T = new Thread(new ThreadStart(NuevoBoton));
            T.Start();
        }
        private void NuevoBoton()
        {
            if (this.InvokeRequired)
            {
                crearBoton CB = new crearBoton(NuevoBoton);//Creamos una instancia del delegate
                                      //pasandole el metodo que estamos ejecutando como parametro
                this.Invoke(CB);  //invocamos el Form pasando el delegate void que recien creamos
            }
            else
            {
                Button B = new Button();
                this.Controls.Add(B);
            }
        }
    }

--- Fin del código ---

U2_Caparzo:

--- Cita de: .net en Miércoles  5 de Septiembre de 2012, 01:01 ---Una solucion buena pero poco usada es agregar una linea en el load del formulario:

 CheckForIllegalCrossThreadCalls = true or false;

Yo no la recomiendo, pero es bueno saber

una buena practica es que recomienda el mensaje anterior


--- Código: ---public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }
        delegate void crearBoton();
        private void Form2_Load(object sender, EventArgs e)
        {
            Thread T = new Thread(new ThreadStart(NuevoBoton));
            T.Start();
        }
        private void NuevoBoton()
        {
            if (this.InvokeRequired)
            {
                crearBoton CB = new crearBoton(NuevoBoton);//Creamos una instancia del delegate
                                      //pasandole el metodo que estamos ejecutando como parametro
                this.Invoke(CB);  //invocamos el Form pasando el delegate void que recien creamos
            }
            else
            {
                Button B = new Button();
                this.Controls.Add(B);
            }
        }
    }

--- Fin del código ---

--- Fin de la cita ---

interesante, ahora mismo investigare, pero solamente el nombre me suena a una gran cantidad de errores potenciales ^^, gracias por la respuesta :)

Navegación

[0] Índice de Mensajes

Ir a la versión completa