Ejemplo de Hilos

10/02/2008 - 17:48 por News Microsoft | Informe spam
Hola !! alguien me puede pasar un enlace o algun ejemplo de acceso a
controles desde un hilo distinto?
quiero un ejemplito simple que haga por ejemplo:

Tengo un formulario Windows con un ritchtextbox y un boton

cuando le de al boton en el evento onclick hago un bucle for
for ( int i = 0; i < 100000 ; ++i )
ritch.AppendText("Iteracion" + i.tostring() + caracteres retorno carro
e inicio de linea )

Quiero hacerlo de modo que ese bucle lo haga de forma asincrona y me rellene
el ritchtextbox sin dejarme bloqueado el formulario.

Gracias de antemano !!

Preguntas similare

Leer las respuestas

#1 Alberto Poblacion
10/02/2008 - 20:38 | Informe spam
"News Microsoft" wrote in message
news:ORrZ$
Hola !! alguien me puede pasar un enlace o algun ejemplo de acceso a
controles desde un hilo distinto?
quiero un ejemplito simple que haga por ejemplo:

Tengo un formulario Windows con un ritchtextbox y un boton

cuando le de al boton en el evento onclick hago un bucle for
for ( int i = 0; i < 100000 ; ++i )
ritch.AppendText("Iteracion" + i.tostring() + caracteres retorno carro
e inicio de linea )

Quiero hacerlo de modo que ese bucle lo haga de forma asincrona y me
rellene el ritchtextbox sin dejarme bloqueado el formulario.



Si estás usando la versión 2.0 (o posterior) del Framework, probablemente
te merezca la pena usar la clase BackgroundWorker. Si usas su evento
ProgressChanged para comunicar los cambios a los controles, no necesitas
prepcuparte de transportar la ejecución al hilo principal mediante
Conrol.Invoke, porque ya lo hace el BackgroundWorker internamente, con lo
que resuta más simple que iniciar un Thread y manipular los controles desde
él.

El artículo del BackgroundWorker en MSDN trae un ejemplo completo:
http://msdn2.microsoft.com/en-us/li...orker.aspx
Respuesta Responder a este mensaje
#2 Paulino Padial
11/02/2008 - 01:36 | Informe spam
Podrías ser un poco mas concreto?
el ejemplo del MSDN es el que utiliza dicho metodo que comentas, el
processchanged para cambiar la barra de progreso.
Todo funciona perfecto cuando accedes a una progressbar pero la cosa cambia
cuando intentas acceder a cualquier otro control, como por ejemplo un
richtextbox que es lo que estoy intentando solucionar y no doy con la tecla.

Necesito ir metiendo el resultado de la operacion del for en el rich sin
bloquear el formulario, seguro que es una tonteria pero no doy con la tecla
:(

saludos cordiales,

"Alberto Poblacion"
escribió en el mensaje de noticias:
"News Microsoft" wrote in message
news:ORrZ$
Hola !! alguien me puede pasar un enlace o algun ejemplo de acceso a
controles desde un hilo distinto?
quiero un ejemplito simple que haga por ejemplo:

Tengo un formulario Windows con un ritchtextbox y un boton

cuando le de al boton en el evento onclick hago un bucle for
for ( int i = 0; i < 100000 ; ++i )
ritch.AppendText("Iteracion" + i.tostring() + caracteres retorno
carro e inicio de linea )

Quiero hacerlo de modo que ese bucle lo haga de forma asincrona y me
rellene el ritchtextbox sin dejarme bloqueado el formulario.



Si estás usando la versión 2.0 (o posterior) del Framework,
probablemente te merezca la pena usar la clase BackgroundWorker. Si usas
su evento ProgressChanged para comunicar los cambios a los controles, no
necesitas prepcuparte de transportar la ejecución al hilo principal
mediante Conrol.Invoke, porque ya lo hace el BackgroundWorker
internamente, con lo que resuta más simple que iniciar un Thread y
manipular los controles desde él.

El artículo del BackgroundWorker en MSDN trae un ejemplo completo:
http://msdn2.microsoft.com/en-us/li...orker.aspx


Respuesta Responder a este mensaje
#3 Alberto Poblacion
11/02/2008 - 09:26 | Informe spam
"Paulino Padial" wrote in message
news:
Podrías ser un poco mas concreto?



O.K., un ejemplo con hilos y con Invoke. Crea un formulario y arrastra
un RichTextBox y un botón. Llama cmdlanzarProceso al botón. Añade un "using
System.Threading;". Añade este código dentro de la clase Form1:

private void cmdlanzarProceso_Click(object sender, EventArgs e)
{
Thread t = new Thread(RutinaProceso);
t.IsBackground = true;
t.Start();
}

private void RutinaProceso()
{
for (int i = 0; i < 10; i++)
{
Thread.Sleep(1000); //Simula el proceso
this.Invoke(new
DelegadoActualizarPantalla(ActualizarPantalla), "Terminado paso "+i);
}
}

private delegate void DelegadoActualizarPantalla(string texto);
private void ActualizarPantalla(string texto)
{
this.richTextBox1.Text += "" + texto;
}


Ya está. Ejecuta el proyecto y pulsa el botón. Verás que se te actualiza
el RichTextBox con el proceso de background sin que se bloquee el
formulario.
Respuesta Responder a este mensaje
#4 Paulino Padial
11/02/2008 - 14:03 | Informe spam
eso es lo que buscaba, muchisimas gracias :)

saludos cordiales

"Alberto Poblacion"
escribió en el mensaje de noticias:
"Paulino Padial" wrote in message
news:
Podrías ser un poco mas concreto?



O.K., un ejemplo con hilos y con Invoke. Crea un formulario y arrastra
un RichTextBox y un botón. Llama cmdlanzarProceso al botón. Añade un
"using System.Threading;". Añade este código dentro de la clase Form1:

private void cmdlanzarProceso_Click(object sender, EventArgs e)
{
Thread t = new Thread(RutinaProceso);
t.IsBackground = true;
t.Start();
}

private void RutinaProceso()
{
for (int i = 0; i < 10; i++)
{
Thread.Sleep(1000); //Simula el proceso
this.Invoke(new
DelegadoActualizarPantalla(ActualizarPantalla), "Terminado paso "+i);
}
}

private delegate void DelegadoActualizarPantalla(string texto);
private void ActualizarPantalla(string texto)
{
this.richTextBox1.Text += "" + texto;
}


Ya está. Ejecuta el proyecto y pulsa el botón. Verás que se te
actualiza el RichTextBox con el proceso de background sin que se bloquee
el formulario.
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida