Fecha y hora actual: Sab 19 May, 2012 20:22 pm
Índice del Foro

Foros de programación informática, diseño gráfico y Web

En esta comunidad intentaremos dar soporte de programación a todos los niveles, desde principiantes a profesionales de la informática, desarrollo de programas, programación web y mucho más.

ayuda nose terminarlo bien

Responder al Tema

Índice del Foro > C, C#, Visual C++ > ayuda nose terminarlo bien

Autor Mensaje
adelad02



Registrado: 03 Ene 2012
Mensajes: 1

Mensaje Publicado: Mar 03 Ene, 2012 15:10 pm

Título del mensaje: ayuda nose terminarlo bien

Responder citando

tengo estre programa en c pero nose acabarlo , lo que tengo compila y ejecuta , pero ejecuta mal xk no hace lo que tiene que hacer el caso es que por mas vueltas que doy no se me ocurre como arreglarlo ya, esplico de que va hay una lista de como mucho 10 clientes, estos hacen llamadas(asigandas por SIGUSR1) son atendidas por tres agentes , cada agente solo atiende un llamada si hay mas de 10 se ignoran, son atendidas por FIFO y las horas de todo i los id quedan regitradoe en un log
Código:
# include <stdio.h>
# include <time.h>
# include <unistd.h>
# include <stdlib.h>
# include <pthread.h>
# include <sys/types.h>
# include <signal.h>

//Declaracion de estructuras//
struct cliente {

   int idC;
   int tiempo_espera,atendido;

};


struct agente {

   int idA;
   
   pthread_t thread_id;
   int ocupado;
};
//-------------------------------//



//Declaracion de VG//

int cont ,huecos ;
FILE *logFile;
pthread_mutex_t semaforoClientes , semaforoAgentes , semaforoLog;
struct agente agentes[3];
struct cliente listaClientes [10];
void nuevaLlamada(int sig);
void *accionAgente(void *arg);
void *accionCliente(void *idC);
void escribirLog(char *id, char *msg);

//------------------------------//

void nuevaLlamada(int sig) {
   
   if (signal(SIGUSR1, nuevaLlamada)==SIG_ERR) {               // se realiza el handler de la se√±al
      perror("Llamada a signal.");
      exit(-1);
   }
   pthread_mutex_lock(&semaforoClientes);                  
   int i ;      
   if ( huecos < 10){                        //miramos si hay huecos para admitir la llaada
      for ( i = 0 ; i < 10 ; i++){                  
         if (listaClientes[i].idC == 0){               // si algun hueco de la lista tiene el id a 0 ai sitio
                 cont = cont +1;                  
            listaClientes[i].idC = cont;            // le asignamos un id
            listaClientes[i].atendido = 0;            // aun no esta atendido
            huecos++;                  //queda un hueco menos
            pthread_t t;
               pthread_create (&t, NULL, accionCliente, (void*)&listaClientes[i].idC  );   //creamos el cliente y paramos
            break;
         }
      }      

   }else {                              // sino hay huecos el cliente que llamo se ignora con un id mas
      cont = cont +1;
      pthread_mutex_lock(&semaforoLog);
      char stid[20];
      sprintf(stid, "cliente_%d", cont);
      escribirLog(stid, "se ha ignorado la llamada del cliente");
      pthread_mutex_unlock(&semaforoLog);
   }
   pthread_mutex_unlock(&semaforoClientes);
}




void *accionCliente(void *Clientes){
   int idCliente,i, l = 0;                     
   idCliente = *(int*)Clientes;
   pthread_mutex_lock(&semaforoLog);     
   char stid[20];
     sprintf(stid, "cliente_%d", idCliente);               
   escribirLog(stid, "hora de inicio llamada");               // se escribe en el log la hora de la llamada con el id del cliente
   pthread_mutex_unlock(&semaforoLog);
   
   srand((int)pthread_self());
   int x=(int)(10.0*rand()/RAND_MAX+1.0);                  // hace un numero aleatorio entre 0 y 9
   
   for(i=0;i<10;i++) {
      if(x==0) {
         while(l<=60) {                     //calculamos los tiempos de espera porcentuales

            if (listaClientes[i].atendido==1) {
               break;
            }
            if(l==60){
               pthread_mutex_lock(&semaforoLog);
               sprintf(stid, "cliente_%d", listaClientes[i].idC);
               escribirLog(stid, "El cliente ha colgado");
               pthread_mutex_unlock(&semaforoLog);
               break;
            }
            sleep(1);
            l=l+1;
         }
      }
      if((x==1) || (x==2)) {
         while(l<=120) {
            if(listaClientes[i].atendido==1) {
               break;
            }
            if(l==120){
               pthread_mutex_lock(&semaforoLog);
               sprintf(stid, "cliente_%d", listaClientes[i].idC);
               escribirLog(stid, "El cliente ha colgado");
               pthread_mutex_unlock(&semaforoLog);
               break;
            }
            sleep(1);
            l=l++;
         }   
      }
      if ((x!= 0)&& (x != 1) && (x != 2)){
         while(l<=180) {
            if(listaClientes[i].atendido==1) {
               break;
            }
            if(l==180){
               pthread_mutex_lock(&semaforoLog);
               sprintf(stid, "cliente_%d", listaClientes[i].idC);
               escribirLog(stid, "El cliente ha colgado");
               pthread_mutex_unlock(&semaforoLog);
               break;
            }
            sleep(1);
            l=l++;
         }
      }
      
   
   }
   pthread_mutex_lock(&semaforoClientes);
   listaClientes[i].idC==0;                //el cliente ya ha sido atendido, su id se torna cero para indicar un hueco libre
   pthread_mutex_unlock(&semaforoClientes);
   huecos = huecos - 1 ;
   
   
}

void *accionAgente (void *Agentes){
   int j = 0 , k = 0, l = 0, min;
   int idAgente = *(int*)Agentes;
   
                           //DUDA 1
                           
   for( j = 0; j < 10 ; j++){
      if ( listaClientes[j].idC != 0 ){
         min = listaClientes[j].idC;
         break ;   
      }
      
   }
   for ( k = 0 ; k <10 ; k++){
      if(listaClientes[k].idC != 0){
         if ( listaClientes[k].idC < min ){
            min = listaClientes[k].idC;
         }      
      }   
   }   
   
   srand((int)pthread_self());
   int x=1+(int)(30.0*rand()/RAND_MAX+10.0);
   while(1){
   pthread_mutex_lock(&semaforoClientes);            
   for ( l = 0; l < 10 ; l++){
      if (listaClientes[l].idC == min){
         listaClientes[l].atendido = 1;}   
   }
   pthread_mutex_unlock(&semaforoClientes);
   
   pthread_mutex_lock(&semaforoLog);
   char stid[20];
   sprintf(stid,"cliente_%d atendido por el agente_%d", listaClientes[l].idC, idAgente);
   escribirLog(stid, "Hora de inicio de atenci√≥n de la llamada");
   pthread_mutex_unlock(&semaforoLog);

   sleep(x);

   pthread_mutex_lock(&semaforoLog);
   sprintf(stid,"cliente_%d atendido por el agente_%d", listaClientes[l].idC, idAgente);
   escribirLog(stid, "Hora de fin de atenci√≥n de la llamada");
   pthread_mutex_unlock(&semaforoLog);
   
   
   
   pthread_mutex_lock(&semaforoClientes);            
   for ( l = 0; l < 10 ; l++){
      if (listaClientes[l].idC == min){
         listaClientes[l].atendido = 0;
         listaClientes[l].idC= 0;
      }   
   }
   pthread_mutex_unlock(&semaforoClientes);
   }
   
}

void escribirLog(char *id, char *msg) {
   // Calculamos la hora actual
   time_t now = time(0);
   struct tm *tlocal = localtime(&now);
   char stnow[20];
   strftime(stnow, 20, "%d/%m/%y %H:%M:%S", tlocal);
   // Escribimos en el log
   logFile = fopen("callcenter.log", "a");
   fprintf(logFile, "[%s] %s: %s\n", stnow, id, msg);
   fclose(logFile);
}


int main(int argc, char* argv[]){
   
   
   if (signal(SIGUSR1, nuevaLlamada) == SIG_ERR) {            // se llama a SIGUSR1
   perror("Llamada a signal.");
   exit(-1);
   }

   pthread_mutex_init(&semaforoClientes, NULL);            //Inicializacion de los semaforos
   pthread_mutex_init(&semaforoLog, NULL);

   cont = 0 ;
   huecos = 0;   

   pthread_mutex_lock(&semaforoClientes);
   
   int i;
   for ( i = 0 ; i < 10 ; i++){
      listaClientes[i].idC=0;
      listaClientes[i].atendido=0;
   }

      
   
   int idA1 = 1;
   int idA2 = 2;
   int idA3 = 3;                        //duda 2
   agentes[0].ocupado = 0;                        //inicializaci√≥n del log ¬øComo se realiza?
   agentes[1].ocupado = 0;                        //inicializaci√≥n del log ¬øComo se realiza?
   agentes[2].ocupado = 0;                        //inicializaci√≥n del log ¬øComo se realiza?   
   pthread_mutex_unlock(&semaforoClientes);
   pthread_create(&agentes[0].thread_id, NULL, accionAgente, (void*)&idA1);
   pthread_create(&agentes[1].thread_id, NULL, accionAgente, (void*)&idA2);
   pthread_create(&agentes[2].thread_id, NULL, accionAgente, (void*)&idA3);
   
   while(1){
      pause();
   }
   return 0;
}

Volver arriba
Ver perfil del usuario Enviar mensaje privado
WhiteSkull
Moderador Global


Registrado: 20 Mar 2009
Mensajes: 2084
Ubicación: y*width+x

Mensaje Publicado: Jue 05 Ene, 2012 20:21 pm

Título del mensaje: Re: ayuda nose terminarlo bien

Responder citando

el código es tuyo? por q no lo depuras?


http://www.youtube.com/watch?v=-lT1zCukNQY
Volver arriba
Ver perfil del usuario Enviar mensaje privado Visitar sitio web del autor
Responder al Tema
Mostrar mensajes anteriores:   
Ir a:  
Todas las horas están en GMT + 2 Horas

Temas relacionados

Tema Autor Foros Respuestas Publicado
El foro no contiene ningún mensaje nuevo

Ayuda por favooor

Yeranea Aviña Preséntate a la comunidad 2 Sab 19 May, 2012 03:35 am Ver último mensaje
El foro no contiene ningún mensaje nuevo

Ayuda Por favor estoy aprendiendo, Error en C++

Leisnar23 C, C#, Visual C++ 1 Vie 18 May, 2012 21:37 pm Ver último mensaje
El foro no contiene ningún mensaje nuevo

Ayuda sentencia

WhiteSkull Java 1 Mar 15 May, 2012 17:20 pm Ver último mensaje
El foro no contiene ningún mensaje nuevo

Ayuda problema con proyecto de C. URGE

nlce C, C#, Visual C++ 1 Dom 13 May, 2012 18:28 pm Ver último mensaje
El foro no contiene ningún mensaje nuevo

Ayuda con Listas Enlazadas! Memoria Dinamica

GuateGio C, C#, Visual C++ 1 Sab 12 May, 2012 00:22 am Ver último mensaje
Panel de Control
No puede crear mensajes, No puede responder temas, No puede editar sus mensajes, No puede borrar sus mensajes, No puede votar en encuestas,