IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Utilisation de la fonction Poll \ Select.


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Utilisation de la fonction Poll \ Select.
    Bonjour, dans le cadre de mon projet, je dois créer un jeu ( Bomberman ) jouable dans le terminal, pour faire ça j'ai mis le terminal en mode non-canonique (mode raw), ensuite je dois surveiller les entrées / sorties pour faire bouger le jouer dans le terminal et actualiser l'affichage (affichage d'une carte ou le personnage évolue).

    j'ai réussi à faire déplacer le joueur et actualiser l'affichage sans l'utilisation de Poll / Select (Alors que c'etait recommandé par le prof), mais là je dois gérer le placement de bombes et leur explosion après 2 secondes, et là je suis obligé d'utiliser ces deux fonctions(Poll/Select).

    D'après ce que j'ai compris, l'événement attendu est un caractère tapé sur le clavier (↓ pour decsendre, ESPACE pour poser une bombe...etc), le résultat doit être l’exécution de la commande correspondante en plus d'actualiser l'affichage, pour ce faire je dois manipuler le terminal(Qui est un fichier, vu que tout est un fichier sous Linux).

    J'ai essayé plusieurs choses mais rien ne marche vraiment, Quelqu'un aurait une idée, ou des explications sur la manière de faire?

    Merci.

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 369
    Points : 23 623
    Points
    23 623
    Par défaut
    Bonsoir,

    poll() et select() sont des appels permettant de surveiller plusieurs descripteurs de fichiers à la fois et qui se débloque dès que l'un d'eux devient non bloquant, c'est-à-dire dès qu'un appel individuel sur l'un de ses descripteurs rendrait la main. C'est pour cela que ton prof exige (avec raison) que tu les utilises : si tu ne le fais pas, ton programme fait probablement du polling (d'où le nom) ou une attente active dans une boucle sans fin : ton programme fonctionne sûrement très bien mais il consomme probablement 100% du temps CPU.

    Ces appels système sont capables de gérer un timeout, c'est-à-dire te rendre malgré tout la main au bout d'un temps imparti si jamais aucun descripteur ne s'est débloqué de lui-même durant ce laps. Ces appels te permettent de savoir facilement si un descripteur s'est débloqué ou si c'est le fait de l'échéance mais, dans tous les cas, il te faudra quand même t'enquérir toi-même de l'heure courante et vérifier tous les événements à échoir (comprendre : toutes les bombes à faire exploser, ainsi que tous les effets graphiques à mettre à jour) et ce sera également à toi de calculer le temps qui te sépare de l'échéance la plus proche pour refaire un tour de boucle et spécifier le timeout adéquat.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci de ta réponse Obsidian, c'est donc pour ça qu'il est recommandé d'utiliser Poll\Select, j'avais compris à peu près mais je cherchre à savoir comment les utiliser de manière concrète, j'ai esseyé ça mais ça ne donne rien, ça retourne zero:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int hit(void)
    {
        struct timeval tv = {0, 0};
        fd_set fds;
     
        FD_ZERO(&fds);
        FD_SET(STDIN_FILENO, &fds);
     
        if(select(STDIN_FILENO, &fds, NULL, NULL, &tv) == 1)
            return 1;
        else
            return 0;
    }

    Alors comment dire à la foction de surveiller l'entrée et d'executer plus ou moins des trucs comme ça?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    switch (c_in)         
               {case 'm' : return 0;   
                case 'p' :            
                    mod_map("/home/ilyes/tp/map.txt", 2, 4); //Déplacement dans la carte
    		typefile ("/home/ilyes/tp/map.txt"); //Affichage de la carte
                    break;
                case 'z' : if((char) verif("/home/ilyes/tp/map.txt", pos-45)!='0'){
    		pos=mod_map("/home/ilyes/tp/map.txt", pos, 0)+1;
    	typefile ("/home/ilyes/tp/map.txt");}
     
     
                	break;
    	    case 's' :if((char) verif("/home/ilyes/tp/map.txt", pos+45)!='0'){
    		pos=mod_map("/home/ilyes/tp/map.txt", pos, 4)+1;
    	typefile ("/home/ilyes/tp/map.txt");}
     
     
                	break;
    	    case 'q' :if((char) verif("/home/ilyes/tp/map.txt", pos-1)!='0'){
    		pos=mod_map("/home/ilyes/tp/map.txt", pos, 1);
    	typefile ("/home/ilyes/tp/map.txt");}
     
     
                	break;
    	    case 'd' :if((char) verif("/home/ilyes/tp/map.txt", pos+1)!='0'){
    		pos=mod_map("/home/ilyes/tp/map.txt", pos, 2)+1;
    	typefile ("/home/ilyes/tp/map.txt");}		
     
     
                	break;
                default :
                    c_out = '*';
                    write(STDOUT_FILENO, &c_out, 1);
    Merci.

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 369
    Points : 23 623
    Points
    23 623
    Par défaut
    Deux petites choses :

    • Le premier paramètre de select() doit être le numéro du plus grand descripteur de fichier PLUS 1 ;
    • Tu passes une durée nulle à travers ta structure timeval, ce qui fait que l'appel ressort immédiatement. C'est à ne pas confondre avec un pointeur « NULL » qui, lui, indique qu'il n'a rien à passer et que la fonction doit donc attendre indéfiniment.

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Si j'ai bien compris, dans mon cas je dois faire un pointeur NULL pour que la fonction select reste active, mais comment executer les actions décrites précédemment avec Select?

  6. #6
    Membre émérite
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 852
    Points : 2 298
    Points
    2 298
    Par défaut
    Juste une chose, c'est soit on utilise un read non bloquant, soit on utilise select. Utiliser les deux en même temps n'a guère de sens de mon point de vue.

    Pour ce qui est de l'utilisation de la fonction select, un exemple très parlant se trouve dans son man (et en plus il fait exactement ce que tu veux faire).

Discussions similaires

  1. [LG]Utilisation de la fonction time
    Par kmitz dans le forum Langage
    Réponses: 4
    Dernier message: 08/04/2005, 13h05
  2. Utilisation de la fonction de déploiement
    Par mchicoix dans le forum XMLRAD
    Réponses: 4
    Dernier message: 01/03/2005, 14h35
  3. [LG]Utilisation de la fonction Random
    Par chloe95 dans le forum Langage
    Réponses: 1
    Dernier message: 01/03/2005, 14h20
  4. Utilisation de la fonction qsort
    Par Jsmeline dans le forum C
    Réponses: 8
    Dernier message: 28/01/2005, 12h40
  5. [LG]librairies : utiliser seulement quelques fonctions
    Par wwwroom dans le forum Langage
    Réponses: 13
    Dernier message: 14/05/2004, 22h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo