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);
}
Exemple #2
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;
}