Aide thread

Signaler
Messages postés
3
Date d'inscription
samedi 13 janvier 2007
Statut
Membre
Dernière intervention
31 mai 2010
-
Messages postés
12303
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
-
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

Messages postés
24
Date d'inscription
lundi 6 mars 2006
Statut
Membre
Dernière intervention
31 mai 2010

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?
Messages postés
3
Date d'inscription
samedi 13 janvier 2007
Statut
Membre
Dernière intervention
31 mai 2010

Qu'est-ce que tu veux dire par section critique ?
Messages postés
24
Date d'inscription
lundi 6 mars 2006
Statut
Membre
Dernière intervention
31 mai 2010

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 ;)
Messages postés
24
Date d'inscription
lundi 6 mars 2006
Statut
Membre
Dernière intervention
31 mai 2010

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.
Messages postés
3
Date d'inscription
samedi 13 janvier 2007
Statut
Membre
Dernière intervention
31 mai 2010

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 ^^
Messages postés
47
Date d'inscription
jeudi 27 avril 2006
Statut
Membre
Dernière intervention
24 juin 2011

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+
Messages postés
14
Date d'inscription
vendredi 14 mai 2010
Statut
Membre
Dernière intervention
9 mars 2011

Il faut chercher du coté des mutex, c'est-à-dire des mécanismes qui contrôlent l'accès aux threads.
Messages postés
12303
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
38
salut

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