Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 24/05/2012, à 18:09

ali_tmg

Problème avec des boucles et des threads !

Bonsoir à tous,

Je viens demander de l'aide sur la communauté Ubuntu pour un petit problème que j'ai dans un petit programme que j'écris en C.
Je suis sur un projet de codage d'un robot ricochet, et dans ce problème, j'en suis à la partie où je dois faire ceci :
- Activer un timer
- Laisser aux joueurs un temps time pour qu'ils répondent.

Ils ont donc time secondes pour répondre et s'ils ne répondent pas, j'arrête.

Pour récapituler, je pourrais faire quelque chose de la sorte :

DÉBUT DU TIMER
LES JOUEURS ENTRENT LEURS CHOIX
      2 cas possibles :
   1. Soit tous les joueurs entrent leurs choix et on sort.
   2. Soit le timer est terminé, et on retient la plus petite valeur entrée par l'un des joueurs.
SORTIE.

J'ai écrit le code suivant :  (le fichier est nommé timer.c)

CODE a écrit :

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <pthread.h>

#define time 5
#define nb_joueurs 4
#define tres_gd_nb 999999999

void* compte_a_rebours(void* data);
void* releve_valeur(void* data);

int main()
{
    // On crée un thread
    pthread_t thread_car; //thread compte a rebours (car)
    pthread_t thread_rv;  //thread releve valeurs (rv)

    // Permet d'exécuter le fonction compte_a_rebours en parallèle de releve de valeurs.
    pthread_create(&thread_car, NULL, compte_a_rebours, NULL);
    pthread_create(&thread_rv, NULL, releve_valeur, NULL);

    // Attend la fin du thread créé
    pthread_join(thread_car, NULL);
    pthread_join(thread_rv, NULL);

    return 0;
}


void* compte_a_rebours(void* data) //Ce sera le compte a rebours.
{
    int tmps = time+1; //On choisit le temps a ecouler ici.
                       //+1 car on incremente directement en entree de boucle.
    do
    {
        tmps--;
        sleep(1); // Le compte a rebours decremente toute les 1 s.
        printf("compte à rebours : %d \n", tmps);
    }while((tmps > 0));

    printf("FIN DU COMPTE A REBOURS !\n");

    return NULL;
}

void* releve_valeur(void* data)
{
    int valeur=-1;
    int compt = 0;
    int okay=tres_gd_nb;

    do
    {
        // Recuperer valeur
        printf("Entrez une valeur avant la fin du compte à rebours ! \n");
        scanf("%d", &valeur);
        printf("La valeur choisie est : %d \n", valeur);
        compt++;
        if(valeur < okay)
        {
            okay = valeur;
        }
    }while((compt != nb_joueurs)); ///PROBLEME DE CONDITION !! Comment l'arreter ?

    printf("Le meilleur coup proposé se ferait en %d coups\n", okay);

    return NULL;
}


Seulement à la compilation (gcc -Wall timer.c -pthreader), je ne sais pas comment faire pour l'arrêter lorsque le compte à rebours se termine !
Le programme ne s'arrête que lorsque l'on rentre un coup par joueur.


Si quelqu'un a une idée !

Merci à tous.

A.T.

Hors ligne

#2 Le 24/05/2012, à 19:38

pingouinux

Re : Problème avec des boucles et des threads !

Bonjour,
Voici un début de solution :
Définir en tête du programme :

int arret=0;

Utiliser cette variable dans les boucles do ... while de compte_a_rebours  et de releve_valeur :

do
{ if(arret) break;
.................
}while(.....);
arret=1;

Le problème est qu'on reste bloqué sur le scanf de releve_valeur, et qu'il faut au moins donner une valeur même si le compte à rebours est terminé.

Hors ligne

#3 Le 25/05/2012, à 10:15

telliam

Re : Problème avec des boucles et des threads !

autre possibilité faire un select avec timer qui attend sur l'entrée standard


"- Un intellectuel assis va moins loin qu'un con qui marche."
Maurice Biraud - Un Taxi pour Tobrouk
Michel Audiard

Hors ligne