Ver Mensaje Individual
  #1 (permalink)  
Antiguo 12/02/2011, 02:10
daimroc
 
Fecha de Ingreso: octubre-2006
Mensajes: 53
Antigüedad: 17 años, 6 meses
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.