void terminerProgramme() { int i, j; DessineSprite(12, 11, VOYANT_ROUGE); printf("Suppression du threadEvent...\n"); if (pthread_cancel(threadHandleEvent) != 0) printf("Erreur de pthread_cancel\n"); pthread_join(threadHandleEvent, NULL); printf("Suppression des Threads cases...\n"); for (i = 0 ; i < NB_LIGNES ; ++i) { for (j = 0 ; j < 10 ; ++j) { pthread_cancel(threadHandleCase[i][j]); } } for (i = 0 ; i < NB_LIGNES ; ++i) { for (j = 0 ; j < 10 ; ++j) { pthread_join(threadHandleCase[i][j], NULL); } } printf("Supression du threadTopScore\n"); pthread_cancel(threadHandleTopScore); pthread_join(threadHandleTopScore, NULL); printf("Supression du threadScore\n"); pthread_cancel(threadHandleScore); pthread_join(threadHandleScore, NULL); printf("Attente du clic sur la croix avant de fermer la grille...\n"); EVENT_GRILLE_SDL event; event = ReadEvent(); while (event.type != CROIX) { event = ReadEvent(); printf("Action recue du type: %d\n", event.type); } // Fermeture de la grille de jeu (SDL) printf("(THREAD EVENT) Fermeture de la grille...\n"); fflush(stdout); FermerGrilleSDL(); fflush(stdout); printf("Suppression du threadDefileMessage\n"); pthread_cancel(threadHandleMessage); if (cleServer) { printf("Deconnection du serveur...\n"); DeconnectionServeur((key_t)cleServer); } exit(0); }
int main(int argc,char* argv[]) { EVENT_GRILLE_SDL event; int i,j; char buffer[80]; char ok; pthread_t threadHandleDefileMessage; pthread_t threadHandlePiece; pthread_t threadHandleEvent; pthread_t threadHandleScore; pthread_t threadHandleGravite; srand((unsigned)time(NULL)); sigemptyset(&sigAct.sa_mask); sigAct.sa_handler = handlerSIGUSR1; sigaction(SIGUSR1,&sigAct,NULL); sigemptyset(&sigAct.sa_mask); sigaction(SIGUSR2,&sigAct,NULL); // Ouverture de la grille de jeu (SDL) printf("(THREAD MAIN) Ouverture de la grille de jeu\n"); fflush(stdout); sprintf(buffer,"!!! TETRIS ZERO GRAVITY !!!"); if (OuvrirGrilleSDL(NB_LIGNES,NB_COLONNES,40,buffer) < 0) { printf("Erreur de OuvrirGrilleSDL\n"); fflush(stdout); exit(1); } // Chargement des sprites et de l'image de fond ChargementImages(); DessineSprite(12,11,VOYANT_VERT); pthread_mutex_init(&mutexMessage,NULL); pthread_mutex_init(&mutexCasesInserees,NULL); pthread_cond_init(&condCasesInserees,NULL); //Creation du thread threadDefileMessage if(pthread_create(&threadHandleDefileMessage,NULL,(void*(*)(void*))threadDefileMessage,(void*)NULL)!=0) { printf("(THREAD MAIN) Erreur de creation threadDefileMessage\n"); exit(-1); } //Creation thread piece if(pthread_create(&threadHandlePiece,NULL,(void*(*)(void*))threadPiece,(void*)NULL)!=0) { printf("(THREAD MAIN) Erreur de creation threadPiece\n"); exit(-1); } //Creation du thread event if(pthread_create(&threadHandleEvent,NULL,(void*(*)(void*))threadEvent,(void*)NULL)!=0) { printf("(THREAD MAIN) Erreur de creation threadEvent\n"); exit(-1); } //Creation du thread Score if(pthread_create(&threadHandleScore,NULL,(void*(*)(void*))threadScore,(void*)NULL)!=0) { printf("(THREAD MAIN) Erreur de creation threadScore\n"); exit(-1); } //Creation des threads Cases pthread_key_create(&cle,NULL); for(i=0;i<14;i++) { for(j=0;j<10;j++) { pthread_mutex_lock(&mutexCaseSet); if(!pCases) pCases=(CASE*)malloc(sizeof(CASE)); pCases->ligne=i; pCases->colonne=j; if(pthread_create(&tabThreadCases[i][j],NULL,(void*(*)(void*))threadCases,(void*)pCases)!=0) { printf("(THREAD MAIN) Erreur de creation threadCases\n"); exit(-1); } } } //Creation threadGravite if(pthread_create(&threadHandleGravite,NULL,(void*(*)(void*))threadGravite,(void*)NULL)!=0) { printf("(THREAD MAIN) Erreur de creation threadGravite\n"); exit(-1); } //Creation threadFinPartie if(pthread_create(&threadHandleFinPartie,NULL,(void*(*)(void*))threadFinPartie,(void*)NULL)!=0) { printf("(THREAD MAIN) Erreur de creation threadFinPartie\n"); exit(-1); } setMessage("Bienvenue dans Tetris Zero Gravity"); ok = 0; while(!ok) { event = ReadEvent(); if (event.type == CROIX) ok = 1; } //pthread_join(threadHandleFinPartie,NULL); // Fermeture de la grille de jeu (SDL) printf("(THREAD MAIN) Fermeture de la grille..."); fflush(stdout); FermerGrilleSDL(); pthread_cancel(threadHandleDefileMessage); pthread_cancel(threadHandlePiece); pthread_cancel(threadHandleEvent); pthread_cancel(threadHandleScore); for(i=0;i<14;i++) { for(j=0;j<10;j++) { pthread_cancel(tabThreadCases[i][j]); } } pthread_cancel(threadHandleGravite); pthread_cancel(threadHandleFinPartie); printf("OK\n"); fflush(stdout); exit(0); }
int FermetureFenetreGraphique() { FermerGrilleSDL(); return 0; }