THREAD BLOQUE

cs_lillie69 Messages postés 18 Date d'inscription lundi 27 mars 2006 Statut Membre Dernière intervention 6 mai 2006 - 5 mai 2006 à 13:44
cs_lillie69 Messages postés 18 Date d'inscription lundi 27 mars 2006 Statut Membre Dernière intervention 6 mai 2006 - 6 mai 2006 à 16:46
Bonjour,

nous sommes en train de coder un jeu en réseau(pour 2 joueurs) et notre
problème est qu'on voudrait qu'une fois que le 1er joueur ait joué il
attende que le 2e joue pour recommencer à jouer.

On a déclaré une variable qu'on incrémente dès qu'un joueur joue.

Mais le 1er joueur qui joue reste bloqué même lorsque le 2e joueur a joué et que celui ci est débloqué.



Thread lancé dans le serveur:

void * jeu(void * voidparam)

{

CLIENT *client=(CLIENT*) voidparam;

int i;

int numero,compteur=0;





do{

numero=reception_entier(client->com);

printf("numero %d\n",numero);

if(numero > 0){

client->vaisseau[numero-2]->nb++;

printf("nb : %d\n",client->vaisseau[numero-2]->nb);

transmettre_chaine(client->com, msg);




if(client->vaisseau[numero-2]->nb==client->vaisseau[numero-2]->taille){

printf("le bateau est coule\n");

transmettre_entier(client->com,1);

transmettre_chaine(client->com, msg2);

compteur++;

}

else{

transmettre_entier(client->com,0);

printf("pas coule\n");

}



}

else {

transmettre_entier(client->com,0);

printf("pas touche\n");

}

printf("-1-joue = %d",joue);

joue++;

printf("-2-joue = %d",joue);

while(joue!=0){

printf("joue : %d",joue);

transmettre_entier(client->com,0);

if(joue==2){

joue=0;

transmettre_entier(client->com,1);

}

}



}

while((compteur<4)&&(joue==0));

pthread_exit(0);

return NULL;

}





Thread lancé dans le client:

void * jeu(void * voidparam)

{

JOUEUR *joueur=(JOUEUR*) voidparam;





Case * c;

int bloque=0,entier,compteur=0;

c=(Case *)malloc(sizeof(Case) *1);

do{

afficher_grille(joueur->grille_jeu);

c=placer_pion(joueur->grille_jeu);

//resultat=controle_case(c->y,c->x,joueur->grille);



transmettre_entier(joueur->com,joueur->grille[c->x][c->y]);



if(joueur->grille[c->x][c->y]>0){

reception_chaine(joueur->com,msg,30);

printf("%s",msg);

entier=reception_entier(joueur->com);

joueur->grille_jeu[c->x][c->y]=1;

if(entier==1){

reception_chaine(joueur->com,msg,30);

printf("%s",msg);

compteur++;

}

}

else joueur->grille_jeu[c->x][c->y]=2;

while(bloque==0){

printf("attente joueur 2");

bloque=reception_entier(joueur->com);

printf("nombre bloque : %d",bloque);

//sleep(1);

}



}

while(compteur<4);

pthread_exit(0);

return NULL;

}



Merci pour vos réponses.

15 réponses

cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
5 mai 2006 à 13:53
SuspendThread
ResumeThread
if(!Meilleur("Joky")) return ERREUR;<
0
cs_lillie69 Messages postés 18 Date d'inscription lundi 27 mars 2006 Statut Membre Dernière intervention 6 mai 2006
5 mai 2006 à 14:03
désolée pourriez vous etre plus claire svp?

merci
0
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
5 mai 2006 à 14:15
Bé SuspendThread(hThread); bloque le thread et ResumeThread(hThread) le reprend,

if(!Meilleur("Joky")) return ERREUR;<
0
cs_lillie69 Messages postés 18 Date d'inscription lundi 27 mars 2006 Statut Membre Dernière intervention 6 mai 2006
5 mai 2006 à 16:09
Le problème se situe au niveau d'une boucle(voir code, j'ai signalé ou est l'erreur)

Thread lancé dans le serveur:
void * jeu(void * voidparam)
{
CLIENT *client=(CLIENT*) voidparam;
int i;
int numero,compteur=0;


do{
numero=reception_entier(client->com);
printf("numero %d\n",numero);
if(numero > 0){
client->vaisseau[numero-2]->nb++;
printf("nb : %d\n",client->vaisseau[numero-2]->nb);
transmettre_chaine(client->com, msg);

if(client->vaisseau[numero-2]->nb==client->vaisseau[numero-2]->taille){
printf("le bateau est coule\n");
transmettre_entier(client->com,1);
transmettre_chaine(client->com, msg2);
compteur++;
}
else{
transmettre_entier(client->com,0);
printf("pas coule\n");
}

}
else {
transmettre_entier(client->com,0);
printf("pas touche\n");
}
printf("-1-joue = %d",joue);
joue++;
printf("-2-joue = %d",joue);
while(joue!=0){
printf("joue : %d",joue);
transmettre_entier(client->com,0);
if(joue==2){
joue=0;
transmettre_entier(client->com,1);
}
}

}
while((compteur<4)&&(joue==0));
pthread_exit(0);
return NULL;
}

Thread lancé dans le client:
void * jeu(void * voidparam)
{
JOUEUR *joueur=(JOUEUR*) voidparam;


Case * c;
int bloque=0,entier,compteur=0;
c=(Case *)malloc(sizeof(Case) *1);
do{
afficher_grille(joueur->grille_jeu);
c=placer_pion(joueur->grille_jeu);


transmettre_entier(joueur->com,joueur->grille[c->x][c->y]);

if(joueur->grille[c->x][c->y]>0){
reception_chaine(joueur->com,msg,30);
printf("%s",msg);
entier=reception_entier(joueur->com);
joueur->grille_jeu[c->x][c->y]=1;
if(entier==1){
reception_chaine(joueur->com,msg,30);
printf("%s",msg);
compteur++;
}
}
else joueur->grille_jeu[c->x][c->y]=2;
while(bloque==0){ le problème est ici,le 1er joueur ne retourne pas dans la suite de la grande boucle de jeu
printf("attente joueur 2");
bloque=reception_entier(joueur->com);
printf("nombre bloque : %d",bloque);

}

}
while(compteur<4);
pthread_exit(0);
return NULL;
}

Merci pour vos réponses.
0

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

Posez votre question
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
5 mai 2006 à 16:58
Bien si la boucle ne se termine jamais c'est que la variable qu'elle évalue est toujours vrai. Donc bloque est toujours egale à 0.

___________________________________________
Les plus grands esprits trouvent toujours une solution
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
5 mai 2006 à 17:01
Je ne vois nulle part un endroit ou bloque est modifié. Si il en existe pas, bien voila le problème. Sinon, bien je comprend pas plus.

___________________________________________
Les plus grands esprits trouvent toujours une solution
0
cs_lillie69 Messages postés 18 Date d'inscription lundi 27 mars 2006 Statut Membre Dernière intervention 6 mai 2006
5 mai 2006 à 19:26
Si dans la partie serveur, lorsque les deux joueurs ont joué le serveur transmet l'entier 1 au client donc ca devrait débloquer le 1er joueur.
Non?
Je me trompe peut etre...
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
5 mai 2006 à 21:48
Mais tu fais une boucle avec une variable qui reste toujours à 0. Tu fait while(bloque == 0). Mais comme je disais, bloque est définie au début de ta fonction et est initialisé à 0 et je ne vois nulle part dans cette même fonction quelque chose pour modifier la variable. Étant donnée que le while reste toujours vrai car bloque est toujours égal à 0, la boucle est infinie. Où bloque est-il modifier dans ta fonction jeu()????

___________________________________________
Les plus grands esprits trouvent toujours une solution
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
5 mai 2006 à 21:50
Ok daccord je vien de trouver:
bloque=reception_entier(joueur->com);
Bon ok, je regarde ça plus en profondeur et je reviend.

___________________________________________
Les plus grands esprits trouvent toujours une solution
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
5 mai 2006 à 22:02
Je dois t'avouer que j'en sais rien. Il y a peut-être un problème dans tes classes ou dans la façon dont tu envoie le paramètre à la fonction.
Encore une chose, je suppose que la variable joue est une variable global. Ici:
joue++;
printf("-2-joue = %d",joue);
while(joue!=0){
printf("joue : %d",joue);
transmettre_entier(client->com,0);
if(joue==2){
joue=0;
transmettre_entier(client->com,1);
}
Tu additionne avant la boucle. Dison que dans la boucle joue = 1. Mais la boucle ne quitte pas tant que joue n'est pas egal à 0. Pourtant, une fois dans la boucle, joue n'est plus additionné ou soustrait. Donc il va rester dans la boucle indéfiniement. Tu peut m'éclairer un peu sur cette section. Dit moi le si je fais fausse route car j'ai énormément de difficulté à lire ton code.

___________________________________________
Les plus grands esprits trouvent toujours une solution
0
cs_lillie69 Messages postés 18 Date d'inscription lundi 27 mars 2006 Statut Membre Dernière intervention 6 mai 2006
5 mai 2006 à 22:54
joue++;
printf("-2-joue = %d",joue);
while(joue!=0){
printf("joue : %d",joue);
transmettre_entier(client->com,0);
if(joue==2){
joue=0;
transmettre_entier(client->com,1);
}

Alors en fait joue est donc initialisé à 0 et lorsque un thread jeu est lancé joue est incrémenté de 1, comme nous avons deux joueurs à un moment on passe donc dans le if et cela remet joueur à 0.

En fait quand le 2e joueur lance le thread ca va réincrémenter joue et donc le passer à deux.Non?
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
6 mai 2006 à 14:25
Le thread lancer par le 2eme jouer incrément-il jouer? Ce thread en question, est-ce que c'est la seconde fonction de ton post plus haut car je ne vois pas de joue++ dans cette même fonction. Mais comme je disais plus haut, c'est probablement une faute dans tes classes car moi, je ne sais plus.

___________________________________________
Les plus grands esprits trouvent toujours une solution
0
cs_lillie69 Messages postés 18 Date d'inscription lundi 27 mars 2006 Statut Membre Dernière intervention 6 mai 2006
6 mai 2006 à 15:33
C'est le 1er thread(celui dans le serveur) qui est lancé à chaque fois qu'un client se connecte.
Ensuite je n'ai pas de classes, mais voici ma structure:

int joue=0;


typedef struct
{
int com;
char nom_joueur[30];
int grille[10][10];
bateau *vaisseau[4];
int score;

} CLIENT;
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
6 mai 2006 à 15:39
D'accord je comprend. reception_entier, reception_chaine... ce sont des fonctions ça? Enfin... à tu essayer de lancer ton application en debug pas à pas? C'est vraiment cette boucle le problème?
while(bloque==0)
Si oui, je reviend à ce que je disais plus haut, si la boucle ne quitte jamais c'est bloque qui n'a jamais d'autre valeur que 0. Sinon, désolé mais je ne vois pas.

___________________________________________
Les plus grands esprits trouvent toujours une solution
0
cs_lillie69 Messages postés 18 Date d'inscription lundi 27 mars 2006 Statut Membre Dernière intervention 6 mai 2006
6 mai 2006 à 16:46
Oui, désolée je n'ai pas été très clair.
Effectivement ce sont des fonctions.
Euh par contre je sais pas comment on fait pour lancer l'application en debug....(on travail sous Unix avec gcc).
Mais je ne comprends pas pourquoi bloque ne changerait pas de valeurs car j'ai l'impression qu'on a fait ce qu'il fallait pour qu'une fois que le 2er joueur ait joué, on transmette une valeur différente de 0 à notre fonction et qui devrait donc débloquer le 1er joueur?!

En tout cas merci quand même pour ton aide
0
Rejoignez-nous