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

Problema con Hilos

Estas en el tema de Problema con Hilos en el foro de .NET en Foros del Web. Buenas tengo una pequeña aplicación que estoy intentando distribuir en subprocesos, para no parar la ejecución "lineal" del programa. Bien este es mi codigo: Código: ...
  #1 (permalink)  
Antiguo 04/10/2005, 04:38
Avatar de Jose_minglein2  
Fecha de Ingreso: noviembre-2004
Mensajes: 2.344
Antigüedad: 19 años, 5 meses
Puntos: 8
Problema con Hilos

Buenas tengo una pequeña aplicación que estoy intentando distribuir en subprocesos, para no parar la ejecución "lineal" del programa. Bien este es mi codigo:

Código:
Private Sub EsperarMoneda()
        Hilo_Puerto = New Threading.Thread(AddressOf LeerPuerto)
        Hilo_Puerto.Start()
End Sub

Private Sub LeerPuerto()
If Puerto_Serie.Read()
ObtenerDatos()
End If
End Sub
 Dim frm_datos As New F_Datos()
 frm_datos.ShowDialog()
Tmp.Start()
Siendo Tmp un Timer.

Pues bien la ejecución, llega al Start del timer, pero después continua en LeerPuerto y sale de dicho procedimiento, por lo que los "ticks" del timer ya no se ejecutan. Es como si saliese del Hilo y como el code está dentro del mismo pues ya no hiciese los ticks,
Entonces lo que me gustaría es que ObtenerDatos, lo ejecutase ya el programa principal y no el Hilo, pero lo hiciese cuando el Hilo mandase una especie de evento o algo así.

¿Alguna sugerencia de como hacer ésto?


Muchas gracias.
  #2 (permalink)  
Antiguo 04/10/2005, 11:11
Avatar de xknown  
Fecha de Ingreso: diciembre-2004
Ubicación: Cusco - Perú
Mensajes: 2.248
Antigüedad: 19 años, 3 meses
Puntos: 7
Hmm, no me quedó muy claro, podrías explicar de mejor manera? (para estos pobres mortales que no entienden! )

Saludos
__________________
Alex Concha
Buayacorp - Programación y Diseño
  #3 (permalink)  
Antiguo 04/10/2005, 12:11
Avatar de Jose_minglein2  
Fecha de Ingreso: noviembre-2004
Mensajes: 2.344
Antigüedad: 19 años, 5 meses
Puntos: 8
Perdona Xknown, pero es que no sabía como explicarlo, la cuestión es que quiero que un subproceso, o sea, un Theard pueda volver a ejecutar un "evento" como si fuese ya el proceso principal.
Lo he hecho de la siguiente manera:

-Cuando el hilo de escucha, escucha (valga la redundacia) cambio el valor de un booleano
-He implementado un Timer que cada segundo comprueba el estado del booleano en proceso principal.
-Si es true, mata el subproceso y llama a la función que quería llamar desde el hilo.


Creo que me he vuelto a liar explicando, pero bueno, es que para las letras soy muy torpe.

Gracias.
  #4 (permalink)  
Antiguo 05/10/2005, 20:59
Avatar de xknown  
Fecha de Ingreso: diciembre-2004
Ubicación: Cusco - Perú
Mensajes: 2.248
Antigüedad: 19 años, 3 meses
Puntos: 7
No tienes porque disculparte, a veces soy muy fastidioso :), tomando el último mensaje, hay la necesidad de cancelar la ejecución de ese hilo? digo eso, porque al fin y al cabo van a llamar al mismo método...
Cita:
-Cuando el hilo de escucha, escucha (valga la redundacia) cambio el valor de un booleano
-He implementado un Timer que cada segundo comprueba el estado del booleano en proceso principal.
-Si es true, mata el subproceso y llama a la función que quería llamar desde el hilo.
o no?

No sé si te será posible o no, pero si pudieras hacer un pequeño ejemplo de lo que ya tienes.

Saludos
__________________
Alex Concha
Buayacorp - Programación y Diseño
  #5 (permalink)  
Antiguo 05/10/2005, 23:46
Avatar de Jose_minglein2  
Fecha de Ingreso: noviembre-2004
Mensajes: 2.344
Antigüedad: 19 años, 5 meses
Puntos: 8
Al mismo método si que llaman, pero el problema viene dado por lo siguiente, dicho método, llama a otro timer, entonces, si llamo al método desde el hilo, cuando ejecuta el timer2.start y continua su ejecución, al finalizar el hilo, el timer ya no continua, supongo que es porque "muere su padre". Pongo un ejemplo del code que tenía y de como lo he resuelto:

Código:
Private Sub EsperarMoneda()
        Hilo_Puerto = New Threading.Thread(AddressOf LeerPuerto)
        Hilo_Puerto.Start()
         .......
End Sub

Private Sub LeerPuerto()
If Puerto_Serie.Read()
ObtenerDatos()
End If
End Sub
Private sub ObtenerDatos
 Dim frm_datos As New F_Datos()
 frm_datos.ShowDialog()
 Tmp.Start()
end sub
Bien aquí el EsperarMoneda() llama a un subproceso (LeerPuerto), que lo que hace es quedar a la escucha del puerto serie, pero sin interrumpir al programa principal, así el usuario puede seguir con la aplicación.
Cuando el puerto serie recibe los datos que requiere, se abre un dialogo para introducir ciertos datos, y al cerrar éste debe comenzar un timer que controla la inactividad.
Pues bien, de ésta forma, tras el Tmp.Start(), finaliza la ejecución del Hilo, y ya no haces ticks.

Por lo que lo soluciono de la siguiente manera:
Código:
Dim variable as boolean = false

Private Sub EsperarMoneda()
        Hilo_Puerto = New Threading.Thread(AddressOf LeerPuerto)
        Hilo_Puerto.Start()
         .......
        Timer_Comprobar.Start()
End Sub

Private Sub LeerPuerto()
If Puerto_Serie.Read()
variable = true
End If
End Sub
Private sub ObtenerDatos
 Dim frm_datos As New F_Datos()
 frm_datos.ShowDialog()
 Tmp.Start()
end sub
private Sub Timer_Comprobar_Tick(...) handles Timer_Comprobar.Tick
    If label1.Visible = False     ' Pongo un mensaje Intermitente
        label1.Visible = True
     else
        label1.Visible = False
     End If
     If variable = true
         Timer_Comprobar.Stop()
         ObtenerDatos()
      end if
end sub

También lo intente con manejadores (AddHandles y eso), pero me sucedía lo mismo. Asi que no se si será la mejor solución, pero si que funciona.
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 15:45.