antoineb27
Messages postés3Date d'inscriptionsamedi 13 janvier 2007StatutMembreDernière intervention31 mai 2010
-
29 mai 2010 à 21:23
coucou747
Messages postés12303Date d'inscriptionmardi 10 février 2004StatutMembreDernière intervention30 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
// 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.
cs_bny
Messages postés24Date d'inscriptionlundi 6 mars 2006StatutMembreDernière intervention31 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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
antoineb27
Messages postés3Date d'inscriptionsamedi 13 janvier 2007StatutMembreDernière intervention31 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 ^^