• Domingo 17 de Noviembre de 2024, 19:43

Autor Tema:  Editar un WindowsForm desde un sub-proceso(thread)  (Leído 10928 veces)

U2_Caparzo

  • Miembro activo
  • **
  • Mensajes: 45
  • Nacionalidad: cl
  • Super duper divertido xDD
    • Ver Perfil
Editar un WindowsForm desde un sub-proceso(thread)
« en: Domingo 2 de Septiembre de 2012, 18:06 »
0
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: [Seleccionar]
    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);
        }
    }

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: [Seleccionar]
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);
            }
        }
    }

espero que a alguien le sirva  :suerte:
Lo dificil se hace... lo imposible se intenta
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.(Frase de Albert Einstein)

.net

  • Miembro MUY activo
  • ***
  • Mensajes: 181
  • Nacionalidad: mx
    • Ver Perfil
Re:Editar un WindowsForm desde un sub-proceso(thread)
« Respuesta #1 en: Miércoles 5 de Septiembre de 2012, 01:01 »
0
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: [Seleccionar]
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);
            }
        }
    }
La lógica lleva a más lógica

Apoyo a un mundo OPEN SOURCE!!!

Eso si es el paraíso

U2_Caparzo

  • Miembro activo
  • **
  • Mensajes: 45
  • Nacionalidad: cl
  • Super duper divertido xDD
    • Ver Perfil
Re:Editar un WindowsForm desde un sub-proceso(thread)
« Respuesta #2 en: Miércoles 5 de Septiembre de 2012, 03:55 »
0
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: [Seleccionar]
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);
            }
        }
    }

interesante, ahora mismo investigare, pero solamente el nombre me suena a una gran cantidad de errores potenciales ^^, gracias por la respuesta :)
Lo dificil se hace... lo imposible se intenta
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.(Frase de Albert Einstein)