begin process at 2012 05 28 11:54:07
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Divers

 > 

Débutant(e)

 > 

aide thread


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

aide thread

samedi 29 mai 2010 à 21:23:22 | aide thread

antoineb27

Bonjour,

je me permet de faire un nouveau sujet car j'ai besoin d'aide, je dois réaliser un bomberman, seulement j'ai un soucis avec mon thread :

le code compile, pas de soucis, mais quand je fais appel a mon thread, le programme plante ...

j'ai testé le code qu'il y a dans le thread, il est fonctionnel; j'ai essayé de lancer le thread avec le minimum de code dedans, ca marche ...

je poste mon code source de ma classe bombe.cpp :

Code C/C++ :

#include <time.h>
#include "Bombe.h"
#include "Labyrinthe.h"
#include "Affichage.h"
#include "Position.h"
#include <iostream>
#include <SDL/SDL.h>
#include <SDL/SDL_thread.h>


using namespace std;


typedef struct parametresThread{
	
	int x, y;
	Labyrinthe* labyrinthe;
	
}parametresThread;

parametresThread* parametres;


Bombe::Bombe(void){

}

Bombe::Bombe(int positionX, int positionY)
{
	m_position.setX(positionX);
	m_position.setY(positionY);
}

Bombe::~Bombe(void)
{
}

/////////////////////////////////////////////// GETTER SETTERS //////////////////////////////////////////////

int Bombe::getDuree(){

	return m_duree;
}

bool Bombe::getEstExplosee(){

	return m_explosee;
}

int Bombe::getPortee(){

	return m_portee;
}

Position Bombe::getPosition(){

	return m_position;
}

bool Bombe::getTraverser(){
	
	return m_traverser;
}

void Bombe::setDuree(int duree){

	m_duree = duree;
}

void Bombe::setEstExplosee(){

	m_explosee = true;
}

void Bombe::setPortee(int portee){

	m_portee = portee;
}

void Bombe::setPosition(Position position){

	m_position = position;
}

void Bombe::setTraversee(){

	m_traverser = false;
}

////////////////////////////////////////////////////// AUTRES METHODES ////////////////////////////////////////////////////


int monThread(void* data){
		
	    parametresThread* parametres = (parametresThread*)data; //casting 
		int tailleX = parametres->labyrinthe->getTailleX();
		int tailleY = parametres->labyrinthe->getTailleY();

		SDL_Delay(3000);

		////////////////////////Explosion haut/////////////////////////
		int positionAbsolue = parametres->y * tailleY + parametres->x;
		string temp = parametres->labyrinthe->getMap();
		const int MAX = 100, MIN = 1;
		int aleat, aleat2;

		parametres->labyrinthe->setMap(positionAbsolue, ".");
		switch(char bloc = temp.at(positionAbsolue - tailleY))
		{
				
		case 'o' :
			//affiche l'explosion
			srand(time(NULL));
			aleat = (rand() % (MAX - MIN + 1)) + MIN; //génération d'un nombre aléatoire pour définir ou non le pop des bonus
			//aleat = 15;
			if( 0 <= aleat && aleat <= 35) // 35% de chances de faire pop un bonus
			{
				aleat2 = (rand() % (MAX - MIN + 1)) + MIN; // génération d'un nombre aléatoire pour définir le type de bonus

				if( 0 <= aleat2 && aleat2 < 33 )
				{
					parametres->labyrinthe->setMap(positionAbsolue - tailleY, "p");
				}
				else if ( 33 <= aleat2 && aleat2 < 66)
				{
					parametres->labyrinthe->setMap(positionAbsolue - tailleY, "i");
				}
				else
				{
					parametres->labyrinthe->setMap(positionAbsolue - tailleY, "u");
				}
			}

			else{ // 80% de chances de ne pas faire pop un bonus 
			parametres->labyrinthe->setMap(positionAbsolue - tailleY, "."); // on affiche donc une case vide
			}

			break;

		case '.' :
			//affiche l'explosion
			break;

		case '1' :
			//explosion, tue le perso, 
			parametres->labyrinthe->setMap(positionAbsolue - tailleY, "."); // on affiche donc une case vide
			break;

		case '2' :
			//explosion, tue le perso, 
			parametres->labyrinthe->setMap(positionAbsolue - tailleY, "."); // on affiche donc une case vide
			break;

		case '3' :
			//explosion, tue le perso, 
			parametres->labyrinthe->setMap(positionAbsolue - tailleY, "."); // on affiche donc une case vide
			break;

		case '4' :
			//explosion, tue le perso, 
			parametres->labyrinthe->setMap(positionAbsolue - tailleY, "."); // on affiche donc une case vide
			break;

		}

		///////////////////explosion bas//////////////////////
		parametres->labyrinthe->setMap(positionAbsolue, ".");
		switch(char bloc = temp.at(positionAbsolue + tailleY))
		{
				
		case 'o' :
			//affiche l'explosion
			srand(time(NULL));
			aleat = (rand() % (MAX - MIN + 1)) + MIN; //génération d'un nombre aléatoire pour définir ou non le pop des bonus
			//aleat = 15;
			if( 0 <= aleat && aleat <= 20) // 20% de chances de faire pop un bonus
			{
				aleat2 = (rand() % (MAX - MIN + 1)) + MIN; // génération d'un nombre aléatoire pour définir le type de bonus

				if( 0 <= aleat2 && aleat2 < 33 )
				{
					parametres->labyrinthe->setMap(positionAbsolue + tailleY, "p");
				}
				else if ( 33 <= aleat2 && aleat2 < 66)
				{
					parametres->labyrinthe->setMap(positionAbsolue + tailleY, "i");
				}
				else
				{
					parametres->labyrinthe->setMap(positionAbsolue + tailleY, "u");
				}
			}

			else{ // 80% de chances de ne pas faire pop un bonus 
			parametres->labyrinthe->setMap(positionAbsolue + tailleY, "."); // on affiche donc une case vide
			}

			break;

		case '.' :
			//affiche l'explosion
			break;

		case '1' :
			//explosion, tue le perso, 
			parametres->labyrinthe->setMap(positionAbsolue + tailleY, "."); // on affiche donc une case vide
			break;

		case '2' :
			//explosion, tue le perso, 
			parametres->labyrinthe->setMap(positionAbsolue + tailleY, "."); // on affiche donc une case vide
			break;

		case '3' :
			//explosion, tue le perso, 
			parametres->labyrinthe->setMap(positionAbsolue + tailleY, "."); // on affiche donc une case vide
			break;

		case '4' :
			//explosion, tue le perso, 
			parametres->labyrinthe->setMap(positionAbsolue + tailleY, "."); // on affiche donc une case vide
			break;

		}


		//////////////////explosion gauche////////////////////
		parametres->labyrinthe->setMap(positionAbsolue, ".");
		switch(char bloc = temp.at(positionAbsolue - 1))
		{
				
		case 'o' :
			//affiche l'explosion
			srand(time(NULL));
			aleat = (rand() % (MAX - MIN + 1)) + MIN; //génération d'un nombre aléatoire pour définir ou non le pop des bonus
			//aleat = 15;
			if( 0 <= aleat && aleat <= 20) // 20% de chances de faire pop un bonus
			{
				aleat2 = (rand() % (MAX - MIN + 1)) + MIN; // génération d'un nombre aléatoire pour définir le type de bonus

				if( 0 <= aleat2 && aleat2 < 33 )
				{
					parametres->labyrinthe->setMap(positionAbsolue - 1, "p");
				}
				else if ( 33 <= aleat2 && aleat2 < 66)
				{
					parametres->labyrinthe->setMap(positionAbsolue - 1, "i");
				}
				else
				{
					parametres->labyrinthe->setMap(positionAbsolue - 1, "u");
				}
			}

			else{ // 80% de chances de ne pas faire pop un bonus 
			parametres->labyrinthe->setMap(positionAbsolue - 1, "."); // on affiche donc une case vide
			}

			break;

		case '.' :
			//affiche l'explosion
			break;

		case '1' :
			//explosion, tue le perso, 
			parametres->labyrinthe->setMap(positionAbsolue - 1, "."); // on affiche donc une case vide
			break;

		case '2' :
			//explosion, tue le perso, 
			parametres->labyrinthe->setMap(positionAbsolue - 1, "."); // on affiche donc une case vide
			break;

		case '3' :
			//explosion, tue le perso, 
			parametres->labyrinthe->setMap(positionAbsolue - 1, "."); // on affiche donc une case vide
			break;

		case '4' :
			//explosion, tue le perso, 
			parametres->labyrinthe->setMap(positionAbsolue - 1, "."); // on affiche donc une case vide
			break;

		}


		//////////////////explosion droite////////////////////
		parametres->labyrinthe->setMap(positionAbsolue, ".");
		switch(char bloc = temp.at(positionAbsolue + 1))
		{
				
		case 'o' :
			//affiche l'explosion
			srand(time(NULL));
			aleat = (rand() % (MAX - MIN + 1)) + MIN; //génération d'un nombre aléatoire pour définir ou non le pop des bonus
			//aleat = 15;
			if( 0 <= aleat && aleat <= 20) // 20% de chances de faire pop un bonus
			{
				aleat2 = (rand() % (MAX - MIN + 1)) + MIN; // génération d'un nombre aléatoire pour définir le type de bonus

				if( 0 <= aleat2 && aleat2 < 33 )
				{
					parametres->labyrinthe->setMap(positionAbsolue + 1, "p");
				}
				else if ( 33 <= aleat2 && aleat2 < 66)
				{
					parametres->labyrinthe->setMap(positionAbsolue + 1, "i");
				}
				else
				{
					parametres->labyrinthe->setMap(positionAbsolue + 1, "u");
				}
			}

			else{ // 80% de chances de ne pas faire pop un bonus 
			parametres->labyrinthe->setMap(positionAbsolue + 1, "."); // on affiche donc une case vide
			}

			break;

		case '.' :
			//affiche l'explosion
			break;

		case '1' :
			//explosion, tue le perso, 
			parametres->labyrinthe->setMap(positionAbsolue + 1, "."); // on affiche donc une case vide
			break;

		case '2' :
			//explosion, tue le perso, 
			parametres->labyrinthe->setMap(positionAbsolue + 1, "."); // on affiche donc une case vide
			break;

		case '3' :
			//explosion, tue le perso, 
			parametres->labyrinthe->setMap(positionAbsolue + 1, "."); // on affiche donc une case vide
			break;

		case '4' :
			//explosion, tue le perso, 
			parametres->labyrinthe->setMap(positionAbsolue + 1, "."); // on affiche donc une case vide
			break;

		}

		return 0;
}



void Bombe::lancerThread(Labyrinthe* labyrinthe){

	SDL_CreateThread(monThread, parametres);
}



d'après les différents tests que j'ai faits, je pense qu'il y a un problème quand j'essaye d'accéder aux variables que j'envoie dans le thread ...

Hésitez pas si vous avez besoin de plus d'infos !

Merci d'avance,

Antoine

PS : le code n'est pas complétement terminé, je pense notamment aux "//explosion, tue le perso";
la map est gérée dans un string
dimanche 30 mai 2010 à 21:26:33 | Re : aide thread

bny

Je suis pas vraiment un pro des threads...mais normalement quand tu veux accéder à des variables partagées tu devrais pas avoir une section critique?
lundi 31 mai 2010 à 09:44:16 | Re : aide thread

antoineb27

Qu'est-ce que tu veux dire par section critique ?
lundi 31 mai 2010 à 15:33:51 | Re : aide thread

bny

Voici la définition : wiki

Si tu veux les fonctions pour en utiliser

CRITICAL_SECTION CS;

// Entre dans la section critique
EnterCriticalSection(&CS);
...
...//Ressources partagées
...
LeaveCriticalSection(&CS);

Dans le fond, si tu as un 2 threads qui écrivent dans la console le mot "jambon", tu mets une section critique pour la ligne de l'écriture en console et ça évitera d'avoir une console qui ressemble à ceci : "jamjabonmbon....". La section critique empêchera un thread de prendre possession de la console tant que l'autre n'a pas fini d'écrire son message au complet...s'en est de même pour des ressources partagées dans un programme.

J'espère avoir été assez clair...bonne chance ;)

lundi 31 mai 2010 à 15:36:15 | Re : aide thread

bny

P.S. Il se peut que ton problème n'aille aucun rapport avec ce que je viens de dire...si c'est le cas désolé...mais tu sauras au moins maintenant c'est quoi une section critique pour faire du multithreading.
lundi 31 mai 2010 à 16:51:54 | Re : aide thread

antoineb27

Ok, je vois ce que tu veux dire !

Le soucis c'est que je suis un peu a court de temps pour me pencher plus amplement sur le problème, j'ai trouvé une autre solution pour contourner le problème ! Merci beaucoup pour ton aide et maintenant comme tu dis, je sais ce qu'est une section critique dans un thread ^^
mercredi 2 juin 2010 à 12:02:26 | Re : aide thread

katerson

J'avoue que je ne connais pas SDL...DSL! Tu utilises quel outil?

Pour ma part, j'utilise la bibliotheque "pthread.h" qui est très simple à utiliser (http://www.siteduzero.com/tutoriel-3-3291-les-threads-et-les-mutex.html)

Bonne chance
A+
dimanche 6 juin 2010 à 00:29:18 | Re : aide thread

manudiclemente

Il faut chercher du coté des mutex, c'est-à-dire des mécanismes qui contrôlent l'accès aux threads.
dimanche 13 juin 2010 à 20:02:28 | Re : aide thread

coucou747

Administrateur CodeS-SourceS
salut

ton projet de supinfo, tu aurais deja du le rendre il me semble :D


Cette discussion est classée dans : parametres, case, labyrinthe, positionabsolue, setmap


Répondre à ce message

Sujets en rapport avec ce message

pb avec un labyrinthe [ par skinia ] je suis sur un projet de labyrinthe et j'ai bloqué pour l' algorithme du plus court chemin (entre un pt qq du labyrinthe et la cible au milieu).le lab labyrinthe [ par skinia ] salut , y aurait il par hasard quequ'un ici qui connait un algorithme pour trouver le plus court chemin entre deux points dans un labyrinthe ce serait switch ... case [ par didrocks ] J'ai un problème est mon case:int n=App->run; // dépendant de la partie du programme en cours switch(n); { case 1: // intro { App->BmpDeFond = App-> ASCII-Navigation par fleche [ par Twinuts ] Salut a tous,j'ai un souci avec les touches directionnelles du clavier, en gros c'est la premiere fois que je les utilise et je ne vois pas pourquoi c API Win32, problème de variable [ par bouba ] Salut a tous, j'ai un blem de variable dans mon programme. Voici mon code source.LPSTR Path="";LRESULT CALLBACK WndProc( HWND hWnd, UINT uMsg, WPARAM switch???? [ par kalf2000 ] salut, je voudrais savoir si l'on peut utiliser le switch de facon à si la variable que l'on compare prend 2 valeur différentes mais que l'on face la Switch et or [ par Tyroflan ] Je ne vois pas cmt mélanger la fonction switch avec un orexemple : int popo;cin >> popo;switch (popo) { case (65||97): / je voudr Sauver un fichier dans un repertoire différent du repertoire courant! [ par jujunio ] Bonjour,Voilà mon pb, je souhaiterais sauver un fichier dans un répertoire autre que le répertoire courant et je ne sais pas comment m'y prendre. voil Problème avec WM_KEYDOWN: [ par cognac ] Pourquoi est-ce que "j" est toujours égal à 2 lorsque je presse F1(même la première fois). Je pensais qu'à chaque fois que je presse F1 "j" augmente d VK_ENTER et VC++ 6.0 [ par didrocks ] J'utilise un switch(wParam) pour détecter les touches frappées.Tout passe: case VK_ESCAPE : case VK_SPACE :case VK_DELETE : ... mais il me fait un


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,716 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales