Problema con hilos

13/01/2009 - 11:50 por Alfredo | Informe spam
Hola

Estoy haciendo una aplicación que trabaja con una base de datos. En un
módulo necesito que se ejecute un procedimiento almacenado de la BBDD. La
idea es que, como el procedimiento tardar unos segundos, aparezca una barra
de progreso o algo similar en el formulario que llama al método que ejecuta
el procedimiento almacenado.
El problema es que no se repinta el formulario hasta que no se ha
ejecutado el método que llama al procedimiento de base de datos. He probado
con hilos pero no se repinta nada hasta que no finaliza el proceso. ¿Cómo
puedo hacer que se actualize el formulario y luego se ejecute el código que
llama al procedimiento almacenado de la BBDD?

Gracias

El código es algo así:

public void HiloClonaExpediente()
{
ExpedienteClonado = Clonacion.ClonarExpedienteSP(IdExpedienteClonacion,
IdMomentoClonacion, FechaClonacion);

}


Y desde el formulario:


Thread hiloclona = new Thread(HiloClonaExpediente);


La idea es que antes de que se ejecute hiloclona.start, se haya repintado el
formulario

Gracias

Preguntas similare

Leer las respuestas

#1 xcal
13/01/2009 - 18:35 | Informe spam
"El problema es que no se repinta el formulario hasta que no se ha
ejecutado el método que llama al procedimiento de base de datos"
hola Alfredo"

no se nada de bases de datos, por lo que ligeramente podria ayudarte
lo que te menciono ahora

trata de ejecutar tareas en segundo plano con backgroundworker,
eso crea otro hilo diferente al que usa tu formulario, entonces
tu formulario no se vera "trabado", porque esta en un hilo independiente.
el backgroundworker es para estos propositos, ahorrandote mucho
de lo que tendrias usualmente que hacer con la clase Thread, y que creo
que es lo que estuviste intentando hasta ahora

espero ayude, Carlos.


"Alfredo" escribió en el mensaje
news:
Hola

Estoy haciendo una aplicación que trabaja con una base de datos. En un
módulo necesito que se ejecute un procedimiento almacenado de la BBDD. La
idea es que, como el procedimiento tardar unos segundos, aparezca una
barra de progreso o algo similar en el formulario que llama al método que
ejecuta el procedimiento almacenado.
El problema es que no se repinta el formulario hasta que no se ha
ejecutado el método que llama al procedimiento de base de datos. He
probado con hilos pero no se repinta nada hasta que no finaliza el
proceso. ¿Cómo puedo hacer que se actualize el formulario y luego se
ejecute el código que llama al procedimiento almacenado de la BBDD?

Gracias

El código es algo así:

public void HiloClonaExpediente()
{
ExpedienteClonado = Clonacion.ClonarExpedienteSP(IdExpedienteClonacion,
IdMomentoClonacion, FechaClonacion);

}


Y desde el formulario:


Thread hiloclona = new Thread(HiloClonaExpediente);


La idea es que antes de que se ejecute hiloclona.start, se haya repintado
el formulario

Gracias



Respuesta Responder a este mensaje
#2 Alberto Poblacion
13/01/2009 - 21:03 | Informe spam
"Alfredo" wrote in message
news:
[...]
Thread hiloclona = new Thread(HiloClonaExpediente);

La idea es que antes de que se ejecute hiloclona.start, se haya repintado
el formulario



Si quieres que se repinte el formulario antes de llamar al Start del
Thread, tendrás que "liberar" momentáneamente el hilo principal (el que va a
hacer el .Start) para darle tiempo a que pinte el formulario. Eso se puede
hacer llamando a Application.DoEvents().

Pero no tiene mucho sentido. Si lo que quieres es mostrar una barra de
progreso mientras se está ejecutando el otro hilo, lo que quieres es que la
barra se vaya repintando DESPUES de haber lanzado el hilo. Y eso es
automático, no hay que hacer nada en especial para que el hilo principal
repinte la pantalla mientras se ejecuta el otro hilo. Lo que sí que tienes
que tener en cuenta es no mantener el hilo principal "pillado" en un bucle.
Por ejemplo, pinta la barra con un Timer, pero no con un bucle "apretado"
que no libere en ningún momento el hilo principal.
Respuesta Responder a este mensaje
#3 Alfredo
14/01/2009 - 07:59 | Informe spam
Lo voy a intentar; tal y como lo tengo ahora el problema es que mientras se
empieza a ejecutar el hilo antes de que termine el método paint. Y hasta que
el hilo no termina (acceso a BBDD que tarda 10 segundos), no se repinta el
formulario, con lo que parece que la aplicación se ha quedado colgada.

"Alberto Poblacion"
escribió en el mensaje news:
"Alfredo" wrote in message
news:
[...]
Thread hiloclona = new Thread(HiloClonaExpediente);

La idea es que antes de que se ejecute hiloclona.start, se haya repintado
el formulario



Si quieres que se repinte el formulario antes de llamar al Start del
Thread, tendrás que "liberar" momentáneamente el hilo principal (el que va
a hacer el .Start) para darle tiempo a que pinte el formulario. Eso se
puede hacer llamando a Application.DoEvents().

Pero no tiene mucho sentido. Si lo que quieres es mostrar una barra de
progreso mientras se está ejecutando el otro hilo, lo que quieres es que
la barra se vaya repintando DESPUES de haber lanzado el hilo. Y eso es
automático, no hay que hacer nada en especial para que el hilo principal
repinte la pantalla mientras se ejecuta el otro hilo. Lo que sí que tienes
que tener en cuenta es no mantener el hilo principal "pillado" en un
bucle. Por ejemplo, pinta la barra con un Timer, pero no con un bucle
"apretado" que no libere en ningún momento el hilo principal.

email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida