Threads y form

Hola,
Tengo un problema, estoy haciendo una aplicación para mi pda,
esta se conecta a mi antena GPS y me entra la información, la descodifico y
muestro por pantalla.
Todo esto lo consigo con un bucle infinito, ahora lo estoy intentando con threads pero estos solo ejecutan métodos static y estos static no admiten el uso, por ejemplo de los label.
Vamos no puedo actualizar el label desde otro hilo.
Lo que quiero es poder tener en pantalla la información recibida y que no se quede el form paralizado, o bien que se pueda parar dentro del mismo hilo.
¿No se si me explico?, quiero tener en un hilo que no es el pricipál el control de un picturebox o un label
no tiene que ser muy complicado porque lo veo muy útil, pero lo que he encontrado por internet no me funciona como BackgroundWorker no lo encuentro para pda
yo trabajo en c# para visual estudio.
Gracias
Un saludo

1 respuesta

Respuesta
1
Debes lanzar la ejecución del hilo de manera asíncrona, y crear un evento que se dispare cuando la tarea finalice, de esa nmanera recibes ek evento en el hilo principal y ya puedes actualizar los controles en el hilo principal.
Hola
Muchas gracias por responder pero creo que no te entiendo
Aquí dos botones y dos label, quiero poder dar a los dos botones a la vez
Con InvokeRequired lo hago asíncrono pero cuando doy a un botón se queda el form paralizado y no puedo pulsar el otro botón
¿Por qué?
Quiero ver los dos label actualizarse a la vez
Gracias, un saludo.
using System.Threading;
namespace h0._3
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        public void button1_Click(object sender, EventArgs e)
        {
            Thread t = new Thread(new ThreadStart(OnEscribirEnLabel));
            t.IsBackground = true;
            t.Priority = ThreadPriority.Lowest;
            t.Start();
            t.Priority = ThreadPriority.Lowest;
        }
        private void button2_Click(object sender, EventArgs e)
        {
            Thread t2 = new Thread(new ThreadStart(OnEscribirEnLabel2));
            t2.IsBackground = true;
            t2.Priority = ThreadPriority.Lowest;
            t2.Start();
        }
        public delegate void EscribirEnLabelHandler();
        public void OnEscribirEnLabel()
        {
                 if (this.InvokeRequired)
                    {
                        this.BeginInvoke (new EscribirEnLabelHandler(OnEscribirEnLabel));
                    }
                    else
                    {
                        for (int i = 0; i <= 2000; i++)
                        {
                            pantalla(Convert.ToString(i));   
                        }
                    }                         
        }
        public void pantalla(string a)
        {
            label1.Refresh();
            label1.Text = a;
        }
        public delegate void EscribirEnLabelHandler2();
        public void OnEscribirEnLabel2()
        {
            if (this.InvokeRequired)
            {
                this.Invoke(new EscribirEnLabelHandler2(OnEscribirEnLabel2));
            }
            else
            {
                for (int i = 0; i <= 2000; i++)
                {
                   this.label2.Refresh();
                   this.label2.Text = Convert.ToString(i) ;
                }
            }
        }
    }
}
Utiliza Application. DoEvents(); despues que actualices el label.
Tu eres bueno, muy bueno jaajja estupendo muchas gracias todavía no lo controlo pero tiene la pinta de ser lo que buscaba, por ahora sigo con mi programa, ya que gracias a ti pase una gran barrera.
Lo siento pero si tengo alguna duda te seguiré preguntando
Conoces la respuesta
Eres conciso
Y rapidísimo
Gracias, seguro que volvemos a hablar.
PD: ya estas en mis favoritos.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas