Pregunta sobre Thread

08/01/2010 - 03:40 por Darhas | Informe spam
Hola a todos

Tendo 2 Subrutinas que las ejecuto con Thread.
Me interesa que hasta que no termine el primer Thread (Hola1), no se ejecute
el segundo Thread (Hola2).
Creo que, con el código que os pongo abajo, lo consigo. El problema es que
no me muestra el programa, mejor dicho el FORM .
Si ejecuto el programa, hace las tareas pero el FORM no aparece.
¿Como puedo lanzar un Thread, que cuando termine, lance otro Thread? Y me
muestre el FORM claro ;)

Os pongo mi codigo
Thread newThread = new Thread(new ThreadStart(Hola1));
Thread newThread2 = new Thread(new ThreadStart (Hola2));
newThread.Start();
while (newThread.IsAlive) ;
newThread2.Start();
while (newThread2.IsAlive) ;
newThread.Join();
newThread2.Join();
CheckForIllegalCrossThreadCalls = false;

Un saludo y gracias a todos
Darhas

Preguntas similare

Leer las respuestas

#1 Alberto Poblacion
08/01/2010 - 08:45 | Informe spam
"Darhas" wrote in message
news:
Tendo 2 Subrutinas que las ejecuto con Thread.
Me interesa que hasta que no termine el primer Thread (Hola1), no se
ejecute
el segundo Thread (Hola2).



Lo más sencillo para conseguir esto es que al final de la subrutina
Hola1 pongas una llamada a Hola2, y te olvides de crear un segundo Thread.

Creo que, con el código que os pongo abajo, lo consigo. El problema es que
no me muestra el programa, mejor dicho el FORM .
Si ejecuto el programa, hace las tareas pero el FORM no aparece.



Tal como lo has escrito, lo que hace el programa es lanzar cada hilo y
dejar el hilo principal en un bucle apretadísimo consumiendo el 100% de la
CPU haciendo un polling al segundo hilo a ver si ha acabado. Mientras no
acaba ese hilo, el hilo principal no sigue adelante, y por tanto no hace lo
que tenga que hacer a continuación (que me imagino que será abrir el form,
aunque no lo muestras en el código que has puesto.

¿Como puedo lanzar un Thread, que cuando termine, lance otro Thread? Y me
muestre el FORM claro ;)



Yo lo haría al revés: Abriría primero el Form, y cuando esté abierto
(por ejemplo, dentro del evento Form_Load) lanzaría el hilo con Thread.Start
y ya está. El Thread puede llamar a una pequeña subrutina que dentro llame
primero a Hola1 y luego a Hola2, con lo cual la segunda no arranca hasta que
termine la primera.

Os pongo mi codigo
[...]
CheckForIllegalCrossThreadCalls = false;



Esto es un auténtico disparate. No se te ocurra poner a false el
CheckForIllegalCrossThreadCalls. Normalmente está a true, y es una medida de
seguridad para detectar las llamadas ilegales entre hilos (cuando el hilo
del thread intenta manipular el form). Si te saltas el control y haces esas
llamadas ilegales, de vez en cuando y de forma aleatoria y espontánea tu
programa fallará, y te resultará casi imposible reproducir el fallo para
depurarlo.
Respuesta Responder a este mensaje
#2 Darhas
08/01/2010 - 22:08 | Informe spam
Hola Alberto

Muchas gracias por la respuesta.

Se me olvido comentarte que el código que te puse está en el Evento Load.

Por eso me extraña que no muestre el Form cuando ejecuta se ejecuta en el
Load del Form

A ver todo esto de los Thread es para que el Programa no se quede en blanco
cuando el usuario le de Click sobre el cuando está trabajando. ¿Hay otra
forma de hacerlo que los Thread?

Creo que el problema está los Threads no se deben lanzar en el Evento Load.
¿Podría ser?

Un saludo
Darhas
Respuesta Responder a este mensaje
#3 Alberto Poblacion
08/01/2010 - 22:24 | Informe spam
"Darhas" wrote in message
news:
Se me olvido comentarte que el código que te puse está en el Evento Load.



Ah, pues por eso no se muestra el Form: tal como estaba escrito tu
código, el thread principal (el que tiene que mostrar el form) se queda
bloqueado esperando a que los otros dos terminen, con lo cual no llega a
mostrar el form (mientras no terminen de ejecutarse los otros dos).

A ver todo esto de los Thread es para que el Programa no se quede en
blanco
cuando el usuario le de Click sobre el cuando está trabajando. ¿Hay otra
forma de hacerlo que los Thread?



Es una buena idea lanzar los procesos largos en un thread separado para
que no se quede bloqueada la interfaz de usuario. Pero si bloqueas aposta la
interfaz de usuario con un bucle de código que se queda parado esperando a
que termine el Thread, pues entonces no has conseguido nada. Para eso no
vale la pena usar un Thread.

Creo que el problema está los Threads no se deben lanzar en el Evento
Load.
¿Podría ser?



No. No hay problema en lanzar un thread desde el evento Load. Lo que no
debes hacer en el evento Load es lo de quedarte parado esperando a que el
Thread se termine.
Respuesta Responder a este mensaje
#4 Darhas
08/01/2010 - 23:36 | Informe spam
Descubierto el problema

He puesto las Rutinas que ejecuta el Thread, las ejecute directamente en el
LOAD del Formulario, sin Thread, directamente las Subrutinas.

El problemas es que primero realiza las subrutinas y luego muestra el
formulario.

Esto porque????, hasta ayer no me pasaba, ¿que he podido tocar???
Respuesta Responder a este mensaje
#5 RFOG
09/01/2010 - 10:45 | Informe spam
Metiéndome donde no me llaman, puede ser porque o bien los threads
empiezan y terminan tan rápido que no le dan tiempo a entrar al
principal, aunque lo más probable es que sigas bloqueando el
principial con algo.

Por otro lado, no entiendo tu acercamiento. ¿Realmente necesitas que
esos threads se ejecuten a la vez que se crea el form?

En .NET, para hacer lo que creo que quieres hacer, tienes varios
acercamientos aparte de los clásicos.

1.- ¿Por qué no creas y ejecutas el thread cuando el usuario solicite
la acción? Antes de entrar en el bucle de lo que quiera que tengas que
hacer, deshabilitas los botones/menús que sean necesarios, y cuando el
thread vaya a terminar los vuelves a activar. Puedes hacerlo desde el
mismo thread pero con Invokes.

2.- Si necesitas hacer algo en el arranque, ponte un timer en el load
del form, pero ponle un periodo suficientemente largo hasta que la
ficha se muestre antes de que se dispare (porque si pones uno más
corto y se dispara ANTES de que el form se muestre, el .NET se hace la
picha un lío y deja de funcionar bien -al menos la última vez que lo
comprobé, han salidos dos SP desde entonces), y cuando se dispare
lanzas los threads.

3.- Delegados asíncronos con notificación asíncrona.

4.- Background Workers, que son como los delegados asíncronos pero más
potentes.

Si no quieres usar Invokes, puedes usar la técnica del timer para
mirar si el hilo sigue en marcha y cuando no esté comenzar el segundo
y/o reactivar la UI...

Varias entradas de mi blog sobre el tema (Aunque son de C++/CLI mapean
directamente cn C#):
http://geeks.ms/blogs/rfog/archive/...hilos.aspx
http://geeks.ms/blogs/rfog/archive/...hilos.aspx

On Fri, 8 Jan 2010 14:36:20 -0800, Darhas
wrote:

Descubierto el problema

He puesto las Rutinas que ejecuta el Thread, las ejecute directamente en el
LOAD del Formulario, sin Thread, directamente las Subrutinas.

El problemas es que primero realiza las subrutinas y luego muestra el
formulario.

Esto porque????, hasta ayer no me pasaba, ¿que he podido tocar???
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida