Accueil > Forum > > > > aide thread
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
|
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
Livres en rapport
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Forum
RE : SAC A DOS RE : SAC A DOS par hadjkaddour
Cliquez pour lire la suite par hadjkaddour
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|