Foros del Web » Programación para mayores de 30 ;) » .NET »

Threads y actualizacion de controles creados fuera del Hilo.

Estas en el tema de Threads y actualizacion de controles creados fuera del Hilo. en el foro de .NET en Foros del Web. Hola, estoy desarrollando una aplicacion en vb 2005 y me ha surgido un problema. La aplicacion usa hilos y actualizcion de formularios desde los hilos. ...
  #1 (permalink)  
Antiguo 16/10/2008, 10:17
 
Fecha de Ingreso: octubre-2008
Mensajes: 12
Antigüedad: 15 años, 6 meses
Puntos: 0
Threads y actualizacion de controles creados fuera del Hilo.

Hola, estoy desarrollando una aplicacion en vb 2005 y me ha surgido un problema. La aplicacion usa hilos y actualizcion de formularios desde los hilos. A continuación pogo parte del codigo (el codigo puede contener errores, porque lo he simplificado para que se entienda mejor):

Código:
1ª Version


Public Class Proceso
'La clase proceso es un formulario. Además dispone de una función (función
'proceso) que es ejecutada desde un hilo. Dentro del hilo se actualizan controles
'del formulario (para ello se recurre a metodos delegados y Invoke)

'Hilo principal en el que se ejecutara el proceso
    Protected Hilo As Threading.Thread

  Public Sub SetValue_Mensajes(ByVal hecho As String)
        'Actualiza el campo de texto Mensajes. En el se muestran los mensajes
        'sobre la evolución del proceso
         

        'Se comprueba si el control ha sido llamado desde
        'otro hilo
        If (Mensajes.InvokeRequired) Then
            'Acceso seguro a la propiedad value de Mensaje
            'desde un Hilo
            Dim delegado As SetValue_Mensajes_Delegado = New SetValue_Mensajes_Delegado(AddressOf SetValue_Mensajes)
            'Me.Mensajes.Invoke(delegado, New Object() {hecho})
        Else
            'Sino quiere decir que se ha llamado desde el propio hilo
            'asi que lo podemos modificar directamente
            Me.Mensajes.Text = hecho
        End If
    End Sub



'Constructor
 Public Sub New()
        ' This call is required by the Windows Form Designer.
        InitializeComponent()

        Dim delegadoPS As Threading.ThreadStart = New Threading.ThreadStart(AddressOf Me.FuncionProceso)
        Hilo = New Threading.Thread(delegadoPS)
End Sub


'Funcion que se ejecuta desde el hilo
 Public ub FuncionProceso()
     ....
     'Calculos
     ....
     'Actualizacion de control de formulario
     Me.SetValue_Mensajes("Funciona")
     ...
End Sub

Public Function Ejecutar() As Integer
     'Lanza el hilo para que ejecute la Funcion del Proceso. 
      Me.Hilo.Start()
End Sub

End Class

Public Class Main

Dim p As Proceso

Public Sub EjecutarMain()
     p.Ejecutar()
End Sub

End Class
La version de Arriba funciona. El problema esta cuando complico un poco mas el asunto. Añado un hilo en la clase Main que es el que llama a la funcion ejecutar de Proceso, es decir, tendria hilos anidados. El codigo de la clase Main queda de la siguiente manera:
Código:
2ª Version

Public Class Main

Private HiloMain As Threading.Thread
Dim p As Proceso


Public Sub New()
        Dim delegadoPS As Threading.ThreadStart = New Threading.ThreadStart(AddressOf Me.FuncionMain)
        HiloMain = New Threading.Thread(delegadoPS)
End Sub


'Funcion que se ejecuta desde el hilo
Public ub FuncionMain()
     p = New Proceso()
     Dim EventosEspera As Threading.AutoResetEvent()
     ReDim EventosEspera(0)
     EventosEspera(0)=p.EventoEspera
     p.Ejecutar()
     'Esperar a que termine de ejecutarse el hilo del proceso
     System.Threading.WaitHandle.WaitAll(EventosEspera)
End Sub


Public Sub EjecutarMain()
     Me.HiloMain.Start()
End Sub



End Class


'Además tambien se a cambiado un poco el codigo de la clase proceso, añadiendo
'una propiedad llamada EventoEspera que es de tipo AutoResetEvent. Esta
'propiedad se inicializa en el constructor de new (se pone como no señalizado)
'y pasa a señalizado al final de FuncionProceso.

'Funcion que se ejecuta desde el hilo
Public ub FuncionProceso()
     ....
     'Calculos
     ....
     'Actualizacion de control de formulario
     Me.SetValue_Mensajes("Funciona")
     ...
     Me.EventoEspera.Set()
End Sub
En esta segunda versión la aplicacion se queda colgada. La aplicación se cuelga en el momento de llamar a Invoke, no muestra ningun mensaje de error simplemente se queda colgada. Yo creo que se debe a que existan hilos anidados, pero no se como solucionarlo. Si comento la linea de Invoke todo funciona bien, bueno aunque el formulario no se refresca (aparece en blanco), pero el codigo en sí se ejecuta bien.

Si alguien sabe porque se cuelga al llamar al metodo Invoke y como podría solucionarlo le estaria muy agradecido. Un saludo a todos y muchas gracías.
  #2 (permalink)  
Antiguo 23/10/2008, 02:34
 
Fecha de Ingreso: octubre-2008
Mensajes: 12
Antigüedad: 15 años, 6 meses
Puntos: 0
Respuesta: Threads y actualizacion de controles creados fuera del Hilo.

up, a ver si alguien puede ayudarme, que estoy un poco perdido.
  #3 (permalink)  
Antiguo 23/10/2008, 06:55
Avatar de Peterpay
Colaborador
 
Fecha de Ingreso: septiembre-2007
Ubicación: San Francisco, United States
Mensajes: 3.858
Antigüedad: 16 años, 8 meses
Puntos: 87
Respuesta: Threads y actualizacion de controles creados fuera del Hilo.

usa un delegado y el invoke

http://msdn.microsoft.com/es-es/libr...ke(VS.80).aspx
__________________
Curso WF4
http://cursos.gurudotnet.com/ DF
Aprende HTML5
  #4 (permalink)  
Antiguo 23/10/2008, 08:38
 
Fecha de Ingreso: octubre-2008
Mensajes: 12
Antigüedad: 15 años, 6 meses
Puntos: 0
Respuesta: Threads y actualizacion de controles creados fuera del Hilo.

Gracias PeterPay, pero ya uso el delegado. Si no tengo hilos anidados funciona, pero si tengo hilos anidados y creo que por eso me falla. Necesito poder usar hilos anidados y que se actualicen correctamente las interfaces. Un saludo
  #5 (permalink)  
Antiguo 23/10/2008, 09:31
Avatar de Peterpay
Colaborador
 
Fecha de Ingreso: septiembre-2007
Ubicación: San Francisco, United States
Mensajes: 3.858
Antigüedad: 16 años, 8 meses
Puntos: 87
Respuesta: Threads y actualizacion de controles creados fuera del Hilo.

Sorry, si me di cuenta tarde de eso, deja le doy una vuelta y te aviso vale.
__________________
Curso WF4
http://cursos.gurudotnet.com/ DF
Aprende HTML5
  #6 (permalink)  
Antiguo 27/10/2008, 03:52
 
Fecha de Ingreso: junio-2003
Ubicación: Asturias
Mensajes: 2.429
Antigüedad: 20 años, 11 meses
Puntos: 7
Respuesta: Threads y actualizacion de controles creados fuera del Hilo.

Intenta poniendo al inicio de la página:

CheckForIllegalCallBacks = False

Haber que pasa..
__________________
Charlie.
  #7 (permalink)  
Antiguo 27/10/2008, 06:12
 
Fecha de Ingreso: octubre-2008
Mensajes: 12
Antigüedad: 15 años, 6 meses
Puntos: 0
Respuesta: Threads y actualizacion de controles creados fuera del Hilo.

Hola, muchas gracias a los dos. Con poner CheckForIllegalCallBacks = False al inicio de la pagina con que te refieres, en que punto exactaente? He estado buscando informacion sobre CheckForIllegalCallBacks pero no he encontrado nada.

Un saludo.
  #8 (permalink)  
Antiguo 27/10/2008, 15:37
 
Fecha de Ingreso: marzo-2008
Mensajes: 99
Antigüedad: 16 años, 1 mes
Puntos: 0
Respuesta: Threads y actualizacion de controles creados fuera del Hilo.

en el load del formulario agrega CheckForIllegalCrossThreadCalls = false;
espero que te sirva.
  #9 (permalink)  
Antiguo 27/10/2008, 16:11
 
Fecha de Ingreso: junio-2003
Ubicación: Asturias
Mensajes: 2.429
Antigüedad: 20 años, 11 meses
Puntos: 7
Respuesta: Threads y actualizacion de controles creados fuera del Hilo.

Eso cojones !!! jajajaja, se me fue la pinza y escribi lo primero que me sonaba.

Prueba con lo que dice carlosdanielmou, deberia funcionarte. Ahora bien, te aviso que es la forma "no elegante" de resolver los problemas.
__________________
Charlie.
  #10 (permalink)  
Antiguo 28/10/2008, 06:52
 
Fecha de Ingreso: octubre-2008
Mensajes: 12
Antigüedad: 15 años, 6 meses
Puntos: 0
Respuesta: Threads y actualizacion de controles creados fuera del Hilo.

He probado a poner unicamente CheckForIllegalCrossThreadCalls = false, pero no ha funcionado. Probare que pasa si pongo CheckForIllegalCrossThreadCalls = false y quito todo lo de los metodos delegados. Gracias a los dos, ya os cuento.
  #11 (permalink)  
Antiguo 29/10/2008, 10:03
 
Fecha de Ingreso: octubre-2008
Mensajes: 12
Antigüedad: 15 años, 6 meses
Puntos: 0
Respuesta: Threads y actualizacion de controles creados fuera del Hilo.

Hola de nuevo, he estado probando y he conseguido algunos avances aunque no hacia donde me gustaría llegar.
He usado CheckForIllegalCrossThreadCalls y conseguido que funcione. Siempre y cuando no cree hilos dentro hilos (si puedo llamar a la ejecucion de hilos dentro de hilos, pero no puedo crear hilos dentro de hilos. Puedo crearlos y funcionar funciona, pero las interfaces no se actualizan). Alguien sabe si existe algun tipo de limitación o como solucionarlo?

Muchas gracias.
  #12 (permalink)  
Antiguo 30/10/2008, 04:13
 
Fecha de Ingreso: octubre-2008
Mensajes: 12
Antigüedad: 15 años, 6 meses
Puntos: 0
Respuesta: Threads y actualizacion de controles creados fuera del Hilo.

Ya está solucionado, muchas gracias. Lo he solucionado haciendo que la ventana sea independiente a la clase que contiene el hilo y usando CheckForIllegalTheardCrossCall=False.
  #13 (permalink)  
Antiguo 31/10/2008, 14:00
Avatar de mvazquez  
Fecha de Ingreso: octubre-2004
Ubicación: Monterrey - México
Mensajes: 875
Antigüedad: 19 años, 6 meses
Puntos: 8
Respuesta: Threads y actualizacion de controles creados fuera del Hilo.

Hola Licantropo28..
Podrias poner por favor tu codigo para ver como lo hiciste, yo tengo un problema similar.

Gracias.
__________________
http://vazquezvega.wordpress.com/
"La paciencia nos da el privilegio de compartir el refrescante fruto de Dios con los demás."
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 07:05.