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

c#: un hilo secundario no actualiza el valor de una variable común actualizada

Estas en el tema de c#: un hilo secundario no actualiza el valor de una variable común actualizada en el foro de .NET en Foros del Web. En C#, en una aplicación de escritorio, tengo un formulario con un textbox donde escribo un valor númerico y un richtextBox para ver qué es ...
  #1 (permalink)  
Antiguo 12/02/2011, 02:10
 
Fecha de Ingreso: octubre-2006
Mensajes: 53
Antigüedad: 18 años
Puntos: 0
c#: un hilo secundario no actualiza el valor de una variable común actualizada

En C#, en una aplicación de escritorio, tengo un formulario con un textbox donde escribo un valor númerico y un richtextBox para ver qué es lo que se está haciendo realmente.

Dentro del formulario, tengo un hilo que ejecuta un método que simplemente es un bucle infinito (un while siempre a true) que lo único que hace es escribir en el richTextBox la fecha y hora actual, y después duerme un tiempo determinado. Este tiempo, es el tiempo indicado en el textBox.

Bien, si al método sleep le paso directamente el valor del textBox (haciendo el cast, claro), al instante aplica el sleep correspondiente a ese valor. De modo que si incialmente estaba a 500ms y pongo 5000, la siguiente iteración duerme 5 segundos.

Sin embargo, yo no quiero que sea tan instantáneo, porque quiero que primero se valide el textBox y luego se aplique el valor. Por ello había pensado en utilizar una variable de clase, que fuera actualizada en el evento validated del textBox, y que fuera esta la que recogiese el método Sleep del hilo que se ejecuta constantemente, en lugar de coger el valor directamente del texbox.

Aquí es donde tengo el problema, que en el caso de utilizar ahora la varibable de clase, la variable común tanto al hilo principal como al secundario, es una variable de intercambio de información, no me coge el nuevo método a no vaya ser que bloquee el hilo secundario y lo desbloquee.

Para bloquear y desbloquear, implementé un botón que mediante Monitor.Enter y Monitor.Exit, bloqueara al hilo secundario o desbloqueara según se pulsara, a modo de interruptor.

En el evento validated del textBox, la actualización de la variable de clase la hago dentro de un lock(), y también he probado a utilizar la opción volatile en el momento de declarar la variable de clase, pero aún así, sigue sin funcionarme.

En definitiva, el problema es que si en el textBox modifico el dato y en el evento de validated actualizo la variable de clase con el nuevo valor, en la iteración del bucle no se usa el nuevo valor hasta que no se bloquea y se libera el hilo.

Creo que el problema es el típico al utilizar hilos, pero no he encontrado la forma de solucionarlo, aunque si es necesario, pongo el código, pero lo que quiero es que el hilo secundario, utilice el valor actualizado por el hilo principal a la hora de determinar el tiempo que tiene que estar dormido.

¿Alguien sabe como se soluciona este problema?



Muchas gracias.
Daimroc.
  #2 (permalink)  
Antiguo 12/02/2011, 04:48
 
Fecha de Ingreso: octubre-2006
Mensajes: 53
Antigüedad: 18 años
Puntos: 0
Respuesta: c#: un hilo secundario no actualiza el valor de una variable común actuali

Lo solucioné.

Bueno, realmente funciona bien, aunque el problema era que se me olvidó implementar un evento del textBox.

Dado que el validated solo se lanza cuando el control pierde el foco, no me daba cuenta que hasta que no saliese del control, no se aplicaría el nuevo valor. Como cuando probaba coger el valor directamente del textBox lo aplicaba al instante, me empeñé que tenía que ser igual a través de la variable.

Por tanto lo que he hecho ha sido implementar el evento keyDown para que cuando detecte que se pulsa el enter, se valide el dato del textBox, y en caso de ser correcto, que se actualice la variable compartida.

Por tanto al final no era un problema de hilos, sino que me había despistado.



Un saludo.
Daimroc.

Etiquetas: hilo, secundario, actualizar, variables
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 00:59.