Error al ejecutar WaitForSingleObject

/* Error al ejecutar WaitForSingleObject
Por que simpre me da error en WaitForSingleObject. He probado muchos cambios y sin resultado
*/
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#define finalizar(mensaje) printf(mensaje),exit(1)
#define en(s,variable) printf("en %s variable = %d\n",en, variable)
#define Nhilos 1
typedef struct{
int id;
HANDLE evento;
} Tparam;
HANDLE mutex[Nhilos +1]={NULL,NULL};
int terminar=0; DWORD res;
char temp[Nhilos];//={0,0,0,0};
DWORD WINAPI controlTemp(void *);
int main(void){// HILO GESTOR.
HANDLE hilos[Nhilos],eventos[Nhilos]; int i,e; Tparam param[Nhilos];
char _temp[Nhilos],_temp_max;//={0,0,0,0};
//HANDLE mutex[Nhilos +1];
//Abrir control, SADs y fijar periodos de muestreo
system("cls");
//Crear N eventos
for(i=1;i<=Nhilos;i++){
param[i-1].id=i;
param[i-1].evento =CreateEvent(NULL,FALSE,FALSE,NULL);
if(param[i-1].evento==NULL)
finalizar("error al crear evento");
}
for(i=0;i<Nhilos+1;i++){
if(mutex = CreateMutex(NULL,0,NULL) == NULL)
finalizar("error al crear el mutex ");
// if(mutex[1] = CreateMutex(NULL,1,NULL) == NULL)
// finalizar("error al crear el mutex ");
}
//if(ReleaseMutex(mutex[1])==0)finalizar("error en release main");
//Crear N hilos con tiempo a que se ejecute cada uno entre hilo e hilo
for(i=1;i<=Nhilos;i++){
if(hilos[i-1] = CreateThread(NULL,0,controlTemp,(void *)&param[i-1],0,NULL) == NULL)
finalizar("error al crear el hilo ");
Sleep(1000);
}
do{/*printf("\n¨terminar(t/n)?: "); terminar = getchar() == 't';
flushall();printf("nueva temperatura: ");scanf("%c",&_temp[0]);flushall();*/
printf("\n\t\tMENU VARIAR\n 1.- periodo\n 2.- temperatura maxima\n 3.- temperatura minima\n 4.- Salir\n 5.- Continuar\n Opcion : ");
fflush(stdin);scanf("%d",&i);fflush(stdin);
switch(i){
case 1:/*printf("\n Zona: ");scanf("%d",&_id);fflush(stdin);
printf("\n Periodo: ");scanf("%d",&_periodo);fflush(stdin); */break;
case 2://printf("\n Zona: ");scanf("%d",&_id);fflush(stdin);
printf("\n Temperatura maxima: ");scanf("%d",&_temp_max);fflush(stdin); break;
case 3:/*printf("\n Zona: ");scanf("%d",&_id);fflush(stdin);
printf("\n Temperatura minima: ");scanf("%d",&_temp_min);fflush(stdin); */break;
case 4: terminar = TRUE; break;
default: break;
}
res=WaitForSingleObject(mutex[0],INFINITE);
if((res!=WAIT_OBJECT_0)&&(res!=WAIT_ABANDONED))finalizar("error en wait main");
//if(res==WAIT_FAILED) finalizar("Error en WaitMultiple main");
printf("region critica main ");
temp[0]=_temp_max;
res=ReleaseMutex(mutex[0]);
if(res==0)finalizar("error en release main");
} while(!terminar);
//Avisar a los hilos que acaben y muestren la temperatura actual
for(i=0;i<Nhilos;i++)
eventos=param.evento;
for(i=0;i<Nhilos;i++){
e=WaitForMultipleObjects(Nhilos,eventos,FALSE,INFINITE);
switch(e){
case WAIT_FAILED:
finalizar("error en waitForMultipleObjetcts ");break;
case WAIT_TIMEOUT:
printf("venció el temporizador ");break;
default: gotoxy(1,10*(Nhilos+1));
printf("HILO %d TERMINADO. TEMPERATURA %d\n",e+1,temp[e]);
}
}
//Cerrar SADs y control
return 0;}
// CÓDIGO COMPARTIDO POR LOS HILOS
DWORD WINAPI controlTemp(void *_param){
Tparam param[Nhilos],__param = *((Tparam *)_param); int i=__param.id,t;
boolean err; //TByte temp;
//if(mutex = CreateMutex(NULL,1,NULL) == NULL)
// finalizar("error al crear el mutex ");
param[i-1]=__param;
while(!terminar){ //variable global modificada en hilo gestor
//res=WaitForSingleObject(mutex[1],INFINITE);
//if((res!=WAIT_OBJECT_0)&&(res!=WAIT_ABANDONED))finalizar("error en wait hilos ");
temp[i-1]++;
//if(ReleaseMutex(mutex[0])==0)finalizar("error en release main");
sleep(1);
gotoxy(1,10*i+10); printf("HILO %d TEMP %d\n",i,temp[i-1]);
}
//Mostrar la última temperatura y terminar, por orden del hilo gestor
printf("Temperatura en zona %d: %d\n",i, temp[i-1]);
//avisar al hilo gestor, mediante evento, de que ha terminado este hilo
t=SetEvent(param[i-1].evento);
if(t==0)
finalizar("error en SetEvent\n");
ExitThread(0);
return 0;}

1 Respuesta

Respuesta
1
disculpa la demora, el código tal como lo has puesto hay que modificar
if(mutex = CreateMutex(NULL,0,NULL) == NULL)
a
if((mutex = CreateMutex(NULL,0,NULL)) == NULL)
y todos los que sean similiares.
¿Lo qué me pregunto es en que IDE lo estás desarrollando este programa?

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas