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 fonction select.


Sujet :

C

  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2012
    Messages : 118
    Par défaut Utilisation fonction select.
    Bonjour,
    Je voudrais réaliser un jeu avec une partie graphique. Le principe est simple, j'affiche à l'écran se que le joueur écrit. Cependant il y aura une sorte d'I.A. donc il faudrait que la saisie ne soit pas bloquante. J'ai trouvé la fonction select et je voudrais savoir si elle est approprié.
    Et si vous pouviez me donner quelques explications sur cette fonction. A ce que j'ai compris cette fonction vérifie si il y à eu une modif sur un ensemble de file descriptor.
    Merci.

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Bonjour,

    Tu vas donner à select un ensemble de "file descriptor" (socket, entrée/sorties standards/fichiers).
    Select sera alors bloquant jusqu'à ce que :
    - le timeout indiqué est dépassé ;
    - au moins un des "file descriptor" a une erreur, est "disponible en lecture" (il y a de nouvelles choses à lire), est "disponible en écriture" (le buffer a été vidé et on peut de nouveau écrire dessus). Dans ce cas là, le temps restant avant la fin du timeout sera renseigné.

    cf man.

    Mais si ton jeu a une partie graphique, je te conseille plutôt d'utiliser les fonctions de lectures du clavier de la bibliothèque que tu utilises (ex. SDL ou CSFML).

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2012
    Messages : 118
    Par défaut
    Merci, pour ta réponse, je voudrais savoir si il ne risque pas d'y avoir des conflits. Si par exemple deux file descriptor sont modifier en meme temps. Par exemple si j'ouvre plusieurs fd, un pour chaque joueur. Si les deux joueur tape au meme moment est ce que je peut vérifier tous les fd. Et je voudrais également savoir si lors de ma lecture des fd si je ne risque pas de lire toutes les infos depuis le début. Par exemple: si un joueur tape "avancer a droite" il fait entrer puis il tape "take". Est ce que lorsque je vais read pour la seconde fois, pour le shoot donc, est ce que le read va se faire depuis le début ou il va continuer aprés la premiere commande ?
    Merci.

  4. #4
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Citation Envoyé par shirohige Voir le message
    Merci, pour ta réponse, je voudrais savoir si il ne risque pas d'y avoir des conflits. Si par exemple deux file descriptor sont modifier en meme temps. Par exemple si j'ouvre plusieurs fd, un pour chaque joueur. Si les deux joueur tape au meme moment est ce que je peut vérifier tous les fd.
    Oui, select est prévu pour cela, select te donne le nombre de FD modifié, il te suffit alors de parcourir ta liste de FD et de voir s'il est "prêt".

    Tu as un petit cour ici.
    Qui te sera très utile surtout si tu compte faire un jeux en ligne.


    Citation Envoyé par shirohige Voir le message
    Et je voudrais également savoir si lors de ma lecture des fd si je ne risque pas de lire toutes les infos depuis le début. Par exemple: si un joueur tape "avancer a droite" il fait entrer puis il tape "take". Est ce que lorsque je vais read pour la seconde fois, pour le shoot donc, est ce que le read va se faire depuis le début ou il va continuer aprés la premiere commande ?
    Merci.
    Non, les FD ont un buffer.
    Quand tu écris, tu remplis ce buffer et quand tu lis, tu le vide. Ainsi tu ne liras pas deux fois une même commande (à moins bien sûr que tu ne l'ai écrite deux fois).

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2012
    Messages : 118
    Par défaut
    Voila, j'ai voulu utiliser select mais mon pc à l'air de très vite tourner. Je ne sais pas si c'est comme cela que l'on utilise select (ça marche mais mon pc à l'air de galérer :S). Je voudrais faire en sorte que le délais d'attente soit le plus court possible, c'est pour cela que j'ai mis timeval à zéro.
    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
    34
    35
    36
     
    #include <stdio.h>
    #include <sys/time.h>
    #include <sys/types.h>
    #include <unistd.h>
     
    int
    main(void)
    {
      fd_set rfds;
      struct timeval tv;
      int retval;
      char buf[100];
      int l;
     
      /* Surveiller stdin (fd 0) en attente d'entrées */
      /* Pendant 5 secondes maxi */
      tv.tv_sec = 0;
      tv.tv_usec = 0;
     
      /* Considérer tv comme indéfini maintenant ! */
      while (1)
        {
          FD_ZERO(&rfds);
          FD_SET(0, &rfds);
          retval = select(1, &rfds, NULL, NULL, &tv);
          if (retval)
            {
              l = read(0, buf, 50);
              buf[l] = 0;
              printf("%s\n", buf);
            }
          /* FD_ISSET(0, &rfds) est vrai */
        }
      return (0);
    }

  6. #6
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Bonjour, si tu met le timeval à 0, tu sortiras du select juste après y être entré à cause du timeout.

    Si tu ne fait qu'un seul thread, je te conseille de mettre un temps de 1/60 ème de seconde pour un tour de boucle complet (ie calculer le temps à attendre au maximum puis attendre à la fin de la boucle pour atteindre le 1/60ème de sonconde) en effet :
    - L'affichage d'un écran est généralement de 60fps, donc au-dessus c'est inutile ;
    - Là tu va pouvoir faire 60 tours par secondes, pour un jeux c'est déjà une très grande réactivité. Selon le type de jeux on peut largement faire 5 tours par secondes.

  7. #7
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2012
    Messages : 118
    Par défaut
    Ok merci je vais limiter c'est juste que mon IA enverras des informations et cela seras surement assez rapide. J'aurais aimé prendre une commande à la fois mais si je ne check pas assez rapidement il se pourrais qu'il y ai plusieurs commandes à parser.

  8. #8
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 33
    Par défaut
    Citation Envoyé par shirohige Voir le message
    Voila, j'ai voulu utiliser select mais mon pc à l'air de très vite tourner. Je ne sais pas si c'est comme cela que l'on utilise select (ça marche mais mon pc à l'air de galérer :S). Je voudrais faire en sorte que le délais d'attente soit le plus court possible, c'est pour cela que j'ai mis timeval à zéro.
    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
    34
    35
    36
     
    #include <stdio.h>
    #include <sys/time.h>
    #include <sys/types.h>
    #include <unistd.h>
     
    int
    main(void)
    {
      fd_set rfds;
      struct timeval tv;
      int retval;
      char buf[100];
      int l;
     
      /* Surveiller stdin (fd 0) en attente d'entrées */
      /* Pendant 5 secondes maxi */
      tv.tv_sec = 0;
      tv.tv_usec = 0;
     
      /* Considérer tv comme indéfini maintenant ! */
      while (1)
        {
          FD_ZERO(&rfds);
          FD_SET(0, &rfds);
          retval = select(1, &rfds, NULL, NULL, &tv);
          if (retval)
            {
              l = read(0, buf, 50);
              buf[l] = 0;
              printf("%s\n", buf);
            }
          /* FD_ISSET(0, &rfds) est vrai */
        }
      return (0);
    }
    Bonjour,
    Juste pour dire que le code n'est pas correct, en plus du timer à 0, il faut savoir que le select modifie la structure timeval (sous linux) après appel (c'est pour ca qu'on y passe un pointeur) et que donc il faut réinitialiser celle ci après(/avant) chaque appel à select!

  9. #9
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 434
    Par défaut
    Si c'est pour un à deux joueurs ia contre humain

    Tu as d'autres choix plus intéressant je pense
    Si c'est en temps réel tu peux mettre l'ia dans un thread
    Si c'est du tour par tous ton le premier joueur joue puis le 2eme.

Discussions similaires

  1. [XL-2010] Utiliser sheet.select dans une fonction personnalisée
    Par sebkem dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 08/04/2015, 15h37
  2. Utilisation fonction select() sur un descripteur
    Par cauriera dans le forum Bibliothèques, systèmes et outils
    Réponses: 2
    Dernier message: 18/06/2012, 09h37
  3. utilisation fonction select
    Par azer355 dans le forum MATLAB
    Réponses: 2
    Dernier message: 13/02/2010, 20h14
  4. [Débutant] Aide utilisation fonctions :(
    Par trakiss dans le forum Débuter
    Réponses: 10
    Dernier message: 27/08/2004, 15h59
  5. Utilisation fonction définie dans un .Dll
    Par jeab. dans le forum Windows
    Réponses: 5
    Dernier message: 23/03/2004, 16h23

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