• Sábado 11 de Mayo de 2024, 08:33

Autor Tema:  Waitforsingleobject Trabajando Con Mutex  (Leído 2274 veces)

kati

  • Nuevo Miembro
  • *
  • Mensajes: 24
    • Ver Perfil
Waitforsingleobject Trabajando Con Mutex
« en: Miércoles 13 de Junio de 2007, 11:24 »
0
Buenas..
Tengo un problema con unos threads que acceden a una misma función. He intentado protegerlos con mutex, lo que no sé si lo hago bién. Mi planteamiento es el siguiente:
En un Form1 tengo la función y creo el mutex con SemMutex1 = CreateMutex(NULL, false, "ReadDirectSem"); en el header declaro HANDLE SemMutex1; "como private".
En un Form2 tengo los threads, encargados de pintar una grafica en diferentes series. Declaro el HANDLE de la misma forma. En el thread tengo el siguiente código:
__fastcall WriteMeasure1::WriteMeasure1(bool CreateSuspended)
: TThread(CreateSuspended)

{
SemMutex1 = OpenMutex(NULL, false, "ReadDirectSem");
Cond = true;
}
void __fastcall WriteMeasure1::Execute(void)
{
do{
    Synchronize(&UpdateLabel1);
    Sleep(500);
    }while(Cond == true);
}
void __fastcall WriteMeasure1::UpdateOutput(void)
{
   WaitForSingleObject(SemMutex1, INFINITE);
   //mi función del Form1
   //aquí la funcíón me retorna los valores que imprimo en el grafico....    
   ReleaseMutex(SemMutex1);
   if(condiciones de salida) Cond = false;
}
Tengo tres threads que acceden a la misma función. El problema es el siguiente:   A los 30 segundos de funcionar, los valores que se pintan en la grafica se mezclan,  es decir, que en la Serie1 (thread1) se me pintan los valores que me retorna  el Thread2, etc. entre ellos se intercanvian estos valores......
Es correcto el código, cómo puedo comprovar si el thread toma el HANDLE del mutex?? He visto algún ejemplo dónde se emplea un switch - case, pero es necesario??
Espero que alguien me pueda echar un cable.....gracias... :P

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Waitforsingleobject Trabajando Con Mutex
« Respuesta #1 en: Miércoles 13 de Junio de 2007, 11:37 »
0
WaitForSingleObject retorna el resultado, en tu caso nunca sera WAIT_TIMEOUT ya que usas INFINITE. Lo que va a pasar es que no van a poder pintar AL MISMO TIEMPO, pero en cuanto uno haga ReleaseMutex otro ya va a poder ...

Igual no se entiende bien que es lo que pretendes hacer.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

kati

  • Nuevo Miembro
  • *
  • Mensajes: 24
    • Ver Perfil
Re: Waitforsingleobject Trabajando Con Mutex
« Respuesta #2 en: Miércoles 13 de Junio de 2007, 12:30 »
0
buenas... :lol:
mi intención es poder pintar un grafico con tres series a la vez.... para ello he creado tres threads, uno para cada serie, que se encargan llamar a una función ( los tres llaman a la misma ) que retorna el valor que debe imprimir en el grafico. He creado los mutex para proteger la función, aunque no sé si es correcto protegerla de la forma que muestro arriba...
Debo quizas introducir el codigo de ejecución del thread dentro de WAIT_OBJECT_0 ?
es que no sé exactamente si manipulo correctamente el HANDLE!!
gracias por contestar..

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Waitforsingleobject Trabajando Con Mutex
« Respuesta #3 en: Miércoles 13 de Junio de 2007, 13:10 »
0
WAIT_OBJECT_0 es seguramente el resultado que devuelve WaitForSingleObject, el punto con tu codigo es que en cuanto un hilo haga ReleaseMutex otro hilo que este esperando en WaitForSingleObject va a obtener el mutex ...

Sigo sin entender que es lo que queres hacer. ¿A que te referis con series? ¿Cuantos "lugares para pintar" hay?

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

kati

  • Nuevo Miembro
  • *
  • Mensajes: 24
    • Ver Perfil
Re: Waitforsingleobject Trabajando Con Mutex
« Respuesta #4 en: Miércoles 13 de Junio de 2007, 14:30 »
0
Ok, a ver si entendí..
El hilo1 en WaitForSingleObjecte obtiene el handle del mutex. Si otros hilos hacen la petición quedaran esperando hasta que se haga ReleaseMutex y puedan obtener el handle del mutex, no??. O sea que si protejo la función Execute() del Thread, no tendra acceso hasta que en algun momento pueda obtener ese HANDLE!!
Lo de las series: Tengo un DBChart con tres series (Series1, Series2, i 3), un grafico de líneas con tres líneas independientes de colores distintos (cada una de ellas es una serie). Cada una es manipulada por un thread.
Es correcto el planteamiento que hago para solucionar el problema o puedo hacerlo de otras formas?
El problema que tengo es que los threads se intercanvian los datos que imprimen en la grafica...o sea que parece que no se proteja bién la función con los Mutex.
Un saludo y gracias!! :P

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Waitforsingleobject Trabajando Con Mutex
« Respuesta #5 en: Miércoles 13 de Junio de 2007, 14:47 »
0
Cita de: "kati"
Ok, a ver si entendí..
El hilo1 en WaitForSingleObjecte obtiene el handle del mutex. Si otros hilos hacen la petición quedaran esperando hasta que se haga ReleaseMutex y puedan obtener el handle del mutex, no??. O sea que si protejo la función Execute() del Thread, no tendra acceso hasta que en algun momento pueda obtener ese HANDLE!!

Casi exacto, no se sabe cual sera el hilo que obtenga el mutex por primera vez. Pero si sabemos que mientras uno de los hilos tenga el mutex (con WaitForSingleObject) los otros se quedan esperando y cuando el hilo que tiene el mutex lo deja (ReleaseMutex) si hay alguno esperando lo obtiene.

Cita de: "kati"
Lo de las series: Tengo un DBChart con tres series (Series1, Series2, i 3), un grafico de líneas con tres líneas independientes de colores distintos (cada una de ellas es una serie). Cada una es manipulada por un thread.
Es correcto el planteamiento que hago para solucionar el problema o puedo hacerlo de otras formas?
El problema que tengo es que los threads se intercanvian los datos que imprimen en la grafica...o sea que parece que no se proteja bién la función con los Mutex.
Un saludo y gracias!! :P

En esto no te puedo ayudar, no se que es un DBChart y no trabajo con Builder. Lo que tenes que entender es que el Mutex te sirve para que no haya dos hilos accediendo al mismo tiempo a un recurso y de esta manera lograr exclusion mutua. Los datos del recurso siempre van a ser correctos, mientras que si dejaras acceder a varios hilos al mismo tiempo serguramente eso no pasaria.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

kati

  • Nuevo Miembro
  • *
  • Mensajes: 24
    • Ver Perfil
Re: Waitforsingleobject Trabajando Con Mutex
« Respuesta #6 en: Miércoles 13 de Junio de 2007, 15:04 »
0
Muchas gracias por tu tiempo, me a sido de gran ayuda!!
Saludos :hola: