Aide thread

antoineb27 Messages postés 3 Date d'inscription samedi 13 janvier 2007 Statut Membre Dernière intervention 31 mai 2010 - 29 mai 2010 à 21:23
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 - 13 juin 2010 à 20:02
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 :


#include <time.h>
#include "Bombe.h"
#include "Labyrinthe.h"
#include "Affichage.h"
#include "Position.h"
#include 
#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

8 réponses

cs_bny Messages postés 24 Date d'inscription lundi 6 mars 2006 Statut Membre Dernière intervention 31 mai 2010
30 mai 2010 à 21:26
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?
0
antoineb27 Messages postés 3 Date d'inscription samedi 13 janvier 2007 Statut Membre Dernière intervention 31 mai 2010
31 mai 2010 à 09:44
Qu'est-ce que tu veux dire par section critique ?
0
cs_bny Messages postés 24 Date d'inscription lundi 6 mars 2006 Statut Membre Dernière intervention 31 mai 2010
31 mai 2010 à 15:33
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 ;)
0
cs_bny Messages postés 24 Date d'inscription lundi 6 mars 2006 Statut Membre Dernière intervention 31 mai 2010
31 mai 2010 à 15:36
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
antoineb27 Messages postés 3 Date d'inscription samedi 13 janvier 2007 Statut Membre Dernière intervention 31 mai 2010
31 mai 2010 à 16:51
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 ^^
0
katerson Messages postés 47 Date d'inscription jeudi 27 avril 2006 Statut Membre Dernière intervention 24 juin 2011
2 juin 2010 à 12:02
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+
0
manudiclemente Messages postés 14 Date d'inscription vendredi 14 mai 2010 Statut Membre Dernière intervention 9 mars 2011
6 juin 2010 à 00:29
Il faut chercher du coté des mutex, c'est-à-dire des mécanismes qui contrôlent l'accès aux threads.
0
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
13 juin 2010 à 20:02
salut

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