void Commande ( TypeVoie entree, TypeVoie sortie ) { //gérer le numero de la voiture //création de la voiture struct Voiture voitureManuelle ={entree, sortie, numVoiture}; //création et envoit du message struct MsgVoiture message={(long)(entree), voitureManuelle}; msgsnd(balVoiture, &message, sizeof (MsgVoiture), 0); //Modification de l'affichage Effacer(MESSAGE); OperationVoie(PLUS,entree); Afficher(MESSAGE,"Votre nouvelle voiture a été ajouté"); Effacer(NUMERO); Afficher(NUMERO,numVoiture,GRAS); Effacer(ENTREE); Afficher(ENTREE,entree,GRAS); Effacer(SORTIE); Afficher(SORTIE,sortie,GRAS); //incremente le numero de voiture if (numVoiture>numeroMaxManuel) numVoiture=1; else numVoiture++; }
static void EffacerPlace (unsigned int num) { switch(num) { case 1: Effacer(ETAT_P1); break; case 2: Effacer(ETAT_P2); break; case 3: Effacer(ETAT_P3); break; case 4: Effacer(ETAT_P4); break; case 5: Effacer(ETAT_P5); break; case 6: Effacer(ETAT_P6); break; case 7: Effacer(ETAT_P7); break; case 8: Effacer(ETAT_P8); break; default : Afficher(MESSAGE, "Erreur de num"); } }
bool FenetreSaisie::qt_invoke( int _id, QUObject* _o ) { switch ( _id - staticMetaObject()->slotOffset() ) { case 0: Login(); break; case 1: Terminer(); break; case 2: Reservation(); break; case 3: SelectionnerOk0(); break; case 4: SelectionnerOk1(); break; case 5: SelectionnerOk2(); break; case 6: SelectionnerOk3(); break; case 7: SelectionnerOk4(); break; case 8: SelectionnerOk((int)static_QUType_int.get(_o+1)); break; case 9: Precedent(); break; case 10: Suivant(); break; case 11: Effacer(); break; case 12: Recherche(); break; case 13: Rendu0(); break; case 14: Rendu1(); break; case 15: Rendu2(); break; case 16: Rendu((int)static_QUType_int.get(_o+1)); break; case 17: languageChange(); break; default: return QDialog::qt_invoke( _id, _o ); } return TRUE; }
static void SignalVoitureSortie ( int noSignal ) // Algorithme : // { int pid; int numeroPlace = -1; int statut; if ((pid = wait(&statut)) == -1) { Afficher(TypeZone::MESSAGE, "Erreur wait pid" ); } numeroPlace = WEXITSTATUS(statut); for(unsigned int i=0;i<NB_PLACES;i++) { if(pidVoituriers[i].numeroPlace == pid) { struct sembuf op; op.sem_num = 0; op.sem_op = -1; op.sem_flg = 0; while(semop(idSemaphoreContenuParking,&op,1) == -1 && errno == EINTR); Effacer((TypeZone)numeroPlace); AfficherSortie(parking->voitures[numeroPlace].usager, parking->voitures[numeroPlace].numeroPlaque, parking->voitures[numeroPlace].heureArrivee, time(NULL)); parking->voitures[numeroPlace] = {0,0,TypeUsager::AUCUN,0}; op.sem_op = 1; semop(idSemaphoreContenuParking, &op, 1); pidVoituriers[i].numeroPlace = -1; GereRequete(); } } } //----- fin de SignalVoitureGaree
void Commande ( char code, unsigned int valeur ) // Algorithme : // Exécute les instructions nécessaire pour la commande qui vient // d'être envoyée en envoyant des messages aux barrières pour 'P', 'A' // et 'S' et en terminant la tâche pour 'E'. { Effacer(MESSAGE); int fileId; switch(code) { case 'e': case 'E': DetruireSimulateur(); break; case 'p': case 'P': switch (valeur) { case 1: fileId = PROF_BLAISE_PASCAL - 1; break; case 2: fileId = ENTREE_GASTON_BERGER - 1; break; default: return; } EnvoyerMessage(filesId[fileId], MSG_ENTREE, PROF, 1 + nbVoiture++ % MAX_NUM_VOITURE, 0); break; case 'a': case 'A': switch (valeur) { case 1: fileId = AUTRE_BLAISE_PASCAL - 1; break; case 2: fileId = ENTREE_GASTON_BERGER - 1; break; default: return; } EnvoyerMessage(filesId[fileId], MSG_ENTREE, AUTRE, 1 + nbVoiture++ % MAX_NUM_VOITURE, 0); break; case 's': case 'S': EnvoyerMessage(filesId[SORTIE_GASTON_BERGER - 1], MSG_SORTIE, AUCUN, 0, valeur); break; default: break; } } //----- fin de Commande
static void GereRequete() // Algorithme : // { int bestChoice = -1; struct sembuf op; op.sem_num = 0; op.sem_op = -1; op.sem_flg = 0; while(semop(idSemaphoreRequete,&op,1) == -1 && errno == EINTR); Voiture v1 = requetes->requetes[0].voiture; Voiture v2 = requetes->requetes[1].voiture; Voiture v3 = requetes->requetes[2].voiture; if(v1.usager == PROF) { if(v3.usager == PROF && v3.heureArrivee < v1.heureArrivee) { bestChoice = 2; } else { bestChoice = 0; } } else if(v3.usager == PROF) { bestChoice = 2; } else if(v2.usager == AUTRE) { if(v3.usager == AUTRE && v3.heureArrivee < v2.heureArrivee) { bestChoice = 2; } else { bestChoice = 1; } } else if(v3.usager != AUCUN) { bestChoice = 2; } if(bestChoice != -1) { Effacer((TypeZone)(TypeZone::REQUETE_R1 + bestChoice)); struct sembuf op; op.sem_num = 0; op.sem_op = 1; op.sem_flg = 0; requetes->requetes[bestChoice].typeBarriere = TypeBarriere::AUCUNE; requetes->requetes[bestChoice].voiture = {0,0,TypeUsager::AUCUN,0}; semop(idSemaphoreSynchro[bestChoice], &op, 1); } op.sem_op = 1; semop(idSemaphoreRequete, &op, 1); op.sem_op = -1; while(semop(idSemaphoreNbPlaces,&op,1) == -1 && errno == EINTR); *nbPlaces = *nbPlaces + 1; op.sem_op = 1; semop(idSemaphoreNbPlaces, &op, 1); } //----- fin de GereRequete
void Commande ( TypeVoie voie, unsigned int duree ) { /** structures pour les opérations sur la durée (lecture) */ struct sembuf getDLock; getDLock.sem_num = dureesLoc; getDLock.sem_op = -1; getDLock.sem_flg = 0; struct sembuf releaseDLock; releaseDLock.sem_num = dureesLoc; releaseDLock.sem_op = 1; releaseDLock.sem_flg = 0; if( ( voie == OUEST ) || ( voie == EST )) { //Ecriture sur la memoire paratagée, protégée par semaphore semop(dureesLoc,&getDLock,1); dureeFeux->dureeEO = duree; semop(dureesLoc,&releaseDLock,1); //Modification de l'affichage Effacer(MESSAGE); Afficher(MESSAGE,"La durée des feux de l'axe EO a changé"); } if( ( voie == SUD ) || ( voie == NORD )) { //Ecriture sur la memoire partagée, protégée par semaphore semop(dureesLoc,&getDLock,1); dureeFeux->dureeNS = duree; semop(dureesLoc,&releaseDLock,1); //Modification de l'affichage Effacer(MESSAGE); Afficher(MESSAGE,"La durée des feux de l'axe NS a changé"); } }
bool RechercheCodesPostaux::qt_invoke( int _id, QUObject* _o ) { switch ( _id - staticMetaObject()->slotOffset() ) { case 0: RechercheCodePostal(); break; case 1: ListeSuivant(); break; case 2: ListePrecedent(); break; case 3: Terminer(); break; case 4: Effacer(); break; case 5: languageChange(); break; default: return QDialog::qt_invoke( _id, _o ); } return TRUE; }
void Commande ( char code ) { if(code == 'Q'){ // Si le generateur est etteint à la fin, on a un waitpid infini if (!generateurActif) kill(pidGenerateur,SIGCONT); //Detachement de la mémoire partagée shmdt(dureeFeux); exit(0); } if (code=='G') { if (generateurActif) { kill(pidGenerateur,SIGSTOP); generateurActif=false; //Modification de l'affichage Effacer(MESSAGE); Effacer(ETAT_GENERATEUR); Afficher(ETAT_GENERATEUR,"OFF",GRAS); Afficher(MESSAGE,"Le generateur a été eteint"); } else { kill(pidGenerateur,SIGCONT); generateurActif=true; //Modification de l'affichage Effacer(MESSAGE); Effacer(ETAT_GENERATEUR); Afficher(ETAT_GENERATEUR,"ON",GRAS); Afficher(MESSAGE,"Le generateur a été activé"); } } }
bool PremierExemple::qt_invoke( int _id, QUObject* _o ) { switch ( _id - staticMetaObject()->slotOffset() ) { case 0: Addition(); break; case 1: Soustraction(); break; case 2: Multiplication(); break; case 3: DivisionEntiere(); break; case 4: Effacer(); break; case 5: Terminer(); break; case 6: languageChange(); break; default: return QDialog::qt_invoke( _id, _o ); } return TRUE; }
static void Moteur(TypeBarriere parametre) // Algorithme : // Phase moteur de la tâche Entree // S'occupe d'aller piocher un message dans la BaL associée à parametre, et à gérer cette voiture // (la faire entrer, ou attendre que ce soit son tour de rentrer si le parking est plein) { struct sembuf reserver = {MUTEX_MEMPARTAGEE, -1,0}; //p Operation --> Reservation struct sembuf liberer = {MUTEX_MEMPARTAGEE, 1, 0}; //v Operation --> liberation msgClavier* voiture = (msgClavier*) malloc(sizeof(struct msgClavier)); if(msgrcv(balId, voiture, TAILLE_MESSAGE, parametre, 0) != -1) { DessinerVoitureBarriere(parametre,voiture->typeVehicule); while(semop(semId,&reserver,1)==-1 && errno==EINTR); //Reservation de la memoire structMemoire *park = (structMemoire *) shmat(idMemPart, NULL, 0) ; //attachement if(park->nbPlacesLibres <= 0) { park->attente[parametre-1] = (*voiture); shmdt(park); //detachement semop(semId,&liberer,1); //Liberation de la memoire partagee AfficherRequete(parametre, voiture->typeVehicule, voiture->tArrivee); SetSemAttente(parametre,1); while(GetSemAttente(parametre) == 1){sleep(0.1);}; Effacer((TypeZone)(parametre+ETAT_P8)); // l'indice de la zone commence à ETAT_P8 + 1, les parametres des portes font le complément d'indice while(semop(semId,&reserver,1)==-1 && errno==EINTR); //Reservation de la memoire park = (structMemoire *) shmat(idMemPart, NULL, 0) ; //atta chement } park->nbPlacesLibres--; shmdt(park); //detachement semop(semId,&liberer,1); //Liberation de la memoire partagee pid_t garer=GarerVoiture(parametre); Voiturier temp; temp.mouvementGarer = garer; temp.voiture = voiture; mouvementPark.push_back(temp); sleep(ATTENTE); } } //----- fin de Moteur
/* * Constructs a FenetreSaisie as a child of 'parent', with the * name 'name' and widget flags set to 'f'. * * The dialog will by default be modeless, unless you set 'modal' to * TRUE to construct a modal dialog. */ FenetreSaisie::FenetreSaisie( QWidget* parent, const char* name, bool modal, WFlags fl ) : QDialog( parent, name, modal, fl ) { if ( !name ) setName( "FenetreSaisie" ); textTitre = new QLabel( this, "textTitre" ); textTitre->setGeometry( QRect( 210, 20, 160, 21 ) ); QFont textTitre_font( textTitre->font() ); textTitre_font.setFamily( "Helvetica [Adobe]" ); textTitre_font.setPointSize( 18 ); textTitre_font.setBold( TRUE ); textTitre->setFont( textTitre_font ); textTitre->setAlignment( int( QLabel::AlignCenter ) ); textNom = new QLabel( this, "textNom" ); textNom->setGeometry( QRect( 30, 50, 59, 20 ) ); lineSaisieNom = new QLineEdit( this, "lineSaisieNom" ); lineSaisieNom->setGeometry( QRect( 100, 50, 220, 20 ) ); ButtonLogin = new QPushButton( this, "ButtonLogin" ); ButtonLogin->setGeometry( QRect( 440, 50, 85, 20 ) ); ButtonLogin->setAutoDefault( FALSE ); ButtonReservation = new QPushButton( this, "ButtonReservation" ); ButtonReservation->setGeometry( QRect( 740, 420, 85, 20 ) ); ButtonReservation->setAutoDefault( FALSE ); ButtonTerminer = new QPushButton( this, "ButtonTerminer" ); ButtonTerminer->setGeometry( QRect( 550, 50, 85, 20 ) ); ButtonTerminer->setAutoDefault( FALSE ); lineNom[0] = new QLineEdit( this, "lineNom" ); lineNom[0]->setGeometry( QRect( 30, 110, 220, 20 ) ); lineNom[0]->setReadOnly( TRUE ); lineNom[1] = new QLineEdit( this, "lineNom" ); lineNom[1]->setGeometry( QRect( 30, 135, 220, 20 ) ); lineNom[1]->setReadOnly( TRUE ); lineNom[2] = new QLineEdit( this, "lineNom" ); lineNom[2]->setGeometry( QRect( 30, 160, 220, 20 ) ); lineNom[2]->setReadOnly( TRUE ); linePrenom[0] = new QLineEdit( this, "linePrenom" ); linePrenom[0]->setGeometry( QRect( 260, 110, 160, 20 ) ); linePrenom[0]->setReadOnly( TRUE ); linePrenom[1] = new QLineEdit( this, "linePrenom" ); linePrenom[1]->setGeometry( QRect( 260, 135, 160, 20 ) ); linePrenom[1]->setReadOnly( TRUE ); linePrenom[2] = new QLineEdit( this, "linePrenom" ); linePrenom[2]->setGeometry( QRect( 260, 160, 160, 20 ) ); linePrenom[2]->setReadOnly( TRUE ); lineTitre[0] = new QLineEdit( this, "lineTitre" ); lineTitre[0]->setGeometry( QRect( 430, 110, 290, 20 ) ); lineTitre[0]->setReadOnly( TRUE ); lineTitre[1] = new QLineEdit( this, "lineTitre" ); lineTitre[1]->setGeometry( QRect( 430, 135, 290, 20 ) ); lineTitre[1]->setReadOnly( TRUE ); lineTitre[2] = new QLineEdit( this, "lineTitre" ); lineTitre[2]->setGeometry( QRect( 430, 160, 290, 20 ) ); lineTitre[2]->setReadOnly( TRUE ); ButtonRendu[0] = new QPushButton( this, "ButtonRendu" ); ButtonRendu[0]->setGeometry( QRect( 740, 110, 85, 20 ) ); ButtonRendu[0]->setAutoDefault( FALSE ); ButtonRendu[1] = new QPushButton( this, "ButtonRendu" ); ButtonRendu[1]->setGeometry( QRect( 740, 135, 85, 20 ) ); ButtonRendu[1]->setAutoDefault( FALSE ); ButtonRendu[2] = new QPushButton( this, "ButtonRendu" ); ButtonRendu[2]->setGeometry( QRect( 740, 160, 85, 20 ) ); ButtonRendu[2]->setAutoDefault( FALSE ); ButtonPrecedent = new QPushButton( this, "ButtonPrecedent" ); ButtonPrecedent->setGeometry( QRect( 60, 365, 85, 20 ) ); ButtonPrecedent->setAutoDefault( FALSE ); ButtonEffacer = new QPushButton( this, "ButtonEffacer" ); ButtonEffacer->setGeometry( QRect( 330, 365, 85, 20 ) ); ButtonEffacer->setAutoDefault( FALSE ); ButtonSuivant = new QPushButton( this, "ButtonSuivant" ); ButtonSuivant->setGeometry( QRect( 600, 365, 85, 20 ) ); ButtonSuivant->setAutoDefault( FALSE ); lineRecherche = new QLineEdit( this, "lineRecherche" ); lineRecherche->setGeometry( QRect( 430, 190, 290, 20 ) ); lineNomOk[0] = new QLineEdit( this, "lineNomOk" ); lineNomOk[0]->setGeometry( QRect( 30, 230, 220, 20 ) ); lineNomOk[0]->setReadOnly( TRUE ); lineNomOk[1] = new QLineEdit( this, "lineNomOk" ); lineNomOk[1]->setGeometry( QRect( 30, 255, 220, 20 ) ); lineNomOk[1]->setReadOnly( TRUE ); lineNomOk[2] = new QLineEdit( this, "lineNomOk" ); lineNomOk[2]->setGeometry( QRect( 30, 280, 220, 20 ) ); lineNomOk[2]->setReadOnly( TRUE ); lineNomOk[3] = new QLineEdit( this, "lineNomOk" ); lineNomOk[3]->setGeometry( QRect( 30, 305, 220, 20 ) ); lineNomOk[3]->setReadOnly( TRUE ); lineNomOk[4] = new QLineEdit( this, "lineNomOk" ); lineNomOk[4]->setGeometry( QRect( 30, 330, 220, 20 ) ); lineNomOk[4]->setReadOnly( TRUE ); linePrenomOk[0] = new QLineEdit( this, "linePrenomOk" ); linePrenomOk[0]->setGeometry( QRect( 260, 230, 160, 20 ) ); linePrenomOk[0]->setReadOnly( TRUE ); linePrenomOk[1] = new QLineEdit( this, "linePrenomOk" ); linePrenomOk[1]->setGeometry( QRect( 260, 255, 160, 20 ) ); linePrenomOk[1]->setReadOnly( TRUE ); linePrenomOk[2] = new QLineEdit( this, "linePrenomOk" ); linePrenomOk[2]->setGeometry( QRect( 260, 280, 160, 20 ) ); linePrenomOk[2]->setReadOnly( TRUE ); linePrenomOk[3] = new QLineEdit( this, "linePrenomOk" ); linePrenomOk[3]->setGeometry( QRect( 260, 305, 160, 20 ) ); linePrenomOk[3]->setReadOnly( TRUE ); linePrenomOk[4] = new QLineEdit( this, "linePrenomOk" ); linePrenomOk[4]->setGeometry( QRect( 260, 330, 160, 20 ) ); linePrenomOk[4]->setReadOnly( TRUE ); lineTitreOk[0] = new QLineEdit( this, "lineTitreOk" ); lineTitreOk[0]->setGeometry( QRect( 430, 230, 270, 20 ) ); lineTitreOk[0]->setReadOnly( TRUE ); lineTitreOk[1] = new QLineEdit( this, "lineTitreOk" ); lineTitreOk[1]->setGeometry( QRect( 430, 255, 270, 20 ) ); lineTitreOk[1]->setReadOnly( TRUE ); lineTitreOk[2] = new QLineEdit( this, "lineTitreOk" ); lineTitreOk[2]->setGeometry( QRect( 430, 280, 270, 20 ) ); lineTitreOk[2]->setReadOnly( TRUE ); lineTitreOk[3] = new QLineEdit( this, "lineTitreOk" ); lineTitreOk[3]->setGeometry( QRect( 430, 305, 270, 20 ) ); lineTitreOk[3]->setReadOnly( TRUE ); lineTitreOk[4] = new QLineEdit( this, "lineTitreOk" ); lineTitreOk[4]->setGeometry( QRect( 430, 330, 270, 20 ) ); lineTitreOk[4]->setReadOnly( TRUE ); lineReserveOk[0] = new QLineEdit( this, "lineReserveOk" ); lineReserveOk[0]->setGeometry( QRect( 700, 230, 20, 20 ) ); lineReserveOk[0]->setReadOnly( TRUE ); lineReserveOk[1] = new QLineEdit( this, "lineReserveOk" ); lineReserveOk[1]->setGeometry( QRect( 700, 255, 20, 20 ) ); lineReserveOk[1]->setReadOnly( TRUE ); lineReserveOk[2] = new QLineEdit( this, "lineReserveOk" ); lineReserveOk[2]->setGeometry( QRect( 700, 280, 20, 20 ) ); lineReserveOk[2]->setReadOnly( TRUE ); lineReserveOk[3] = new QLineEdit( this, "lineReserveOk" ); lineReserveOk[3]->setGeometry( QRect( 700, 305, 20, 20 ) ); lineReserveOk[3]->setReadOnly( TRUE ); lineReserveOk[4] = new QLineEdit( this, "lineReserveOk" ); lineReserveOk[4]->setGeometry( QRect( 700, 330, 20, 20 ) ); lineReserveOk[4]->setReadOnly( TRUE ); ButtonSelectionnerOk[0] = new QPushButton( this, "ButtonSelectionnerOk" ); ButtonSelectionnerOk[0]->setGeometry( QRect( 740, 230, 85, 20 ) ); ButtonSelectionnerOk[0]->setAutoDefault( FALSE ); ButtonSelectionnerOk[1] = new QPushButton( this, "ButtonSelectionnerOk" ); ButtonSelectionnerOk[1]->setGeometry( QRect( 740, 255, 85, 20 ) ); ButtonSelectionnerOk[1]->setAutoDefault( FALSE ); ButtonSelectionnerOk[2] = new QPushButton( this, "ButtonSelectionnerOk" ); ButtonSelectionnerOk[2]->setGeometry( QRect( 740, 280, 85, 20 ) ); ButtonSelectionnerOk[2]->setAutoDefault( FALSE ); ButtonSelectionnerOk[3] = new QPushButton( this, "ButtonSelectionnerOk" ); ButtonSelectionnerOk[3]->setGeometry( QRect( 740, 305, 85, 20 ) ); ButtonSelectionnerOk[3]->setAutoDefault( FALSE ); ButtonSelectionnerOk[4] = new QPushButton( this, "ButtonSelectionnerOk" ); ButtonSelectionnerOk[4]->setGeometry( QRect( 740, 330, 85, 20 ) ); ButtonSelectionnerOk[4]->setAutoDefault( FALSE ); textSaisie = new QLabel( this, "textSaisie" ); textSaisie->setGeometry( QRect( 30, 190, 330, 20 ) ); textMessage = new QTextEdit( this, "textMessage" ); textMessage->setGeometry( QRect( 30, 420, 685, 58 ) ); textMessage->setReadOnly( TRUE ); textInformation = new QLabel( this, "textInformation" ); textInformation->setGeometry( QRect( 30, 390, 80, 20 ) ); QFont textInformation_font( textInformation->font() ); textInformation_font.setFamily( "Helvetica [Adobe]" ); textInformation_font.setBold( TRUE ); textInformation->setFont( textInformation_font ); textSelection = new QLabel( this, "textSelection" ); textSelection->setGeometry( QRect( 30, 80, 180, 20 ) ); languageChange(); resize( QSize(850, 500).expandedTo(minimumSizeHint()) ); clearWState( WState_Polished ); // signals and slots connections connect( ButtonLogin, SIGNAL( clicked() ), this, SLOT( Login() ) ); connect( ButtonReservation, SIGNAL( clicked() ), this, SLOT( Reservation() ) ); connect( lineSaisieNom, SIGNAL( returnPressed() ), this, SLOT( Login() ) ); connect( ButtonEffacer, SIGNAL( clicked() ), this, SLOT( Effacer() ) ); connect( ButtonTerminer, SIGNAL( clicked() ), this, SLOT( Terminer() ) ); connect( ButtonPrecedent, SIGNAL( clicked() ), this, SLOT( Precedent() ) ); connect( ButtonSuivant, SIGNAL( clicked() ), this, SLOT( Suivant() ) ); connect( lineRecherche, SIGNAL( returnPressed() ), this, SLOT( Recherche() ) ); connect( ButtonRendu[0], SIGNAL( clicked() ), this, SLOT( Rendu0() ) ); connect( ButtonRendu[1], SIGNAL( clicked() ), this, SLOT( Rendu1() ) ); connect( ButtonRendu[2], SIGNAL( clicked() ), this, SLOT( Rendu2() ) ); connect( ButtonSelectionnerOk[0], SIGNAL( clicked() ), this, SLOT( SelectionnerOk0() ) ); connect( ButtonSelectionnerOk[1], SIGNAL( clicked() ), this, SLOT( SelectionnerOk1() ) ); connect( ButtonSelectionnerOk[2], SIGNAL( clicked() ), this, SLOT( SelectionnerOk2() ) ); connect( ButtonSelectionnerOk[3], SIGNAL( clicked() ), this, SLOT( SelectionnerOk3() ) ); connect( ButtonSelectionnerOk[4], SIGNAL( clicked() ), this, SLOT( SelectionnerOk4() ) ); }
void HandleSignalSortie(int sig) //handler du signal SIGUSR2 { //Actualisation du nombre de places semop(id_sem, &reserver, 1); //Reservation de la ressource critique memoire->placesDispos++; semop(id_sem, &liberer, 1); //Liberation de la ressource critique //Recuperation de la voiture sortie int numPlace; pid_t pidVoiturier = waitpid((pid_t)(-1),&numPlace, WNOHANG); numPlace=WEXITSTATUS(numPlace); itMap=voituriers.find(pidVoiturier); Voiture voiture = itMap->second; //Actualisation de la memoire partagee semop(id_sem, &reserver, 1); //Reservation de la ressource critique memoire->parking[numPlace-1].usager = AUCUN; semop(id_sem, &liberer, 1); //Liberation de la ressource critique voituriers.erase(itMap); //analyse des requetes int prioritaire = definirPrioritaire(); if(prioritaire != 0){ semop(id_sem, &reserver, 1); //Reservation de la ressource critique memoire->demandes[prioritaire-1].usager = AUCUN; semop(id_sem, &liberer, 1); //Liberation de la ressource critique struct sembuf libererEntree = {prioritaire, 1, 0}; int s = semop(id_sem, &libererEntree, 1); //deblocage de l'entree autorise } //actualisation de l'affichage switch(numPlace){ case 1: Effacer(ETAT_P1); break; case 2: Effacer(ETAT_P2); break; case 3: Effacer(ETAT_P3); break; case 4: Effacer(ETAT_P4); break; case 5: Effacer(ETAT_P5); break; case 6: Effacer(ETAT_P6); break; case 7: Effacer(ETAT_P7); break; case 8: Effacer(ETAT_P8); break; } switch(prioritaire){ case 1: Effacer(REQUETE_R1); break; case 2: Effacer(REQUETE_R2); break; case 3: Effacer(REQUETE_R3); break; } AfficherSortie(voiture.usager, voiture.matricule, voiture.heureArrivee, time(NULL)); //heure de sortie calculée au dernier moment afin de gagner plus d'argent }
void Entree(TypeBarriere typeBarriere) { //definition des id d'acces au boites aux lettres et semaphores long msgBufEntreeId; long msgbufRequeteId; unsigned short semElementSyncEntree; TypeZone zoneEcranRequete; switch (typeBarriere) { case PROF_BLAISE_PASCAL : //deja initialises aux bonnes valeurs; msgBufEntreeId = MSGBUF_ID_ENTREE_P; msgbufRequeteId = MSGBUF_ID_REQUETE_P; semElementSyncEntree = SEMELM_SINC_ENTREE_P; zoneEcranRequete = REQUETE_R1; break; case AUTRE_BLAISE_PASCAL : msgBufEntreeId = MSGBUF_ID_ENTREE_A; msgbufRequeteId = MSGBUF_ID_REQUETE_A; semElementSyncEntree = SEMELM_SINC_ENTREE_A; zoneEcranRequete = REQUETE_R2; break; case ENTREE_GASTON_BERGER : msgBufEntreeId = MSGBUF_ID_ENTREE_GB; msgbufRequeteId = MSGBUF_ID_REQUETE_GB; semElementSyncEntree = SEMELM_SINC_ENTREE_GB; zoneEcranRequete = REQUETE_R3; break; default : std::cerr << "not an entry process error" << std::endl; return; break; } //initialisation init(); //phase moteur pid_t pidCurr; Voiture voiture; for(;;) { //appel bloquant, attente d'une demande d'entree if(msgrcv(msgbuffId, &voiture, sizeof(Voiture)-sizeof(long), msgBufEntreeId, 0) == -1) continue; // sarestart (sur les erreurs aussi) DessinerVoitureBarriere(typeBarriere, voiture.typeUsager); if(semVal(SEMELM_PLACEDISPO) > 0) { if((pidCurr = GarerVoiture(typeBarriere)) != -1) { semP(SEMELM_PLACEDISPO); mapVoiturier.insert(std::pair<pid_t, Voiture>(pidCurr, voiture)); } } else { //affiche requete AfficherRequete(typeBarriere,voiture.typeUsager,voiture.heureArrivee); Requete re; re.type = msgbufRequeteId; re.heureArrivee = voiture.heureArrivee; re.typeUsager = voiture.typeUsager; if(msgsnd(msgbuffId, &re, sizeof(Requete)-sizeof(long), 0 )==-1); semP(semElementSyncEntree); if((pidCurr = GarerVoiture(typeBarriere)) != -1) { //met à jour l'heure d'entree dans le parking voiture.heureArrivee = time(NULL); mapVoiturier.insert(std::pair<pid_t, Voiture>(pidCurr, voiture)); } Effacer(zoneEcranRequete); } } }