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 :

condition sur une touche actionnée


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 31
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 52
    Par défaut condition sur une touche actionnée
    Bonjour

    voila je fait un petit programme et un moment je reçois des informations en boucle car je ne connais pas le nombre d'information.

    Je voudrais que si l'utilisateur appuie sur 'q' par exemple il parte sur une condition. Est-ce possible ?

    Mais ici la fonction recv est bloquante donc si on a fini de recevoir toutes les données le programme restera bloqué sur l'instruction 'recv' donc si 'q' est actionné ça ne marchera pas ? comment faire sinon ?

    J'avais pensé à ceci mais je ne suis pas sur que ça fonctionnera:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    while(1)  // boucle qui reçois des données 
      {
       memset(buffer, '\0', sizeof(buffer)); 
       n = recv(s, buffer, sizeof(buffer) - 1, 0);
       printf("%s\n", buffer);
     
       if (getch(q)) // si j'appuie sur 'q' alors: 
        {
             printf("test ok");
        } 
      }
    Merci

  2. #2
    Membre éprouvé
    Inscrit en
    Juin 2008
    Messages
    91
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 91
    Par défaut
    Bonjour,

    getch() étant une fonction bloquante, ça m'étonnerait que tu obtienne le comportement que tu souhaiterais avoir.

    En solution alternative (je suppose que tu utilise un thread vu la boucle while(1)) mets le getch() dans un autre thread qui désactivera celui-ci (pour quoi pas dans le main).

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 31
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 52
    Par défaut
    alors oui.

    Se matin j'ai fait un truc de se genre mais la fonction 'recv' une fois qu'elle ne reçois plus rien bloque donc ça ne marche pas. est-il possible de rendre recv non bloquant seulement à cette endroit ? ou de procéder autrement ?

    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
     
    int frappe;
     
    pthread_t thread;
    pthread_create(&thread, NULL, touche, &frappe);
     
      while(1)
      {
       memset(buffa, '\0', sizeof(buffa)); 
       n = recv(s, buffa, sizeof(buffa) - 1, 0);
       printf("%s\n", buffa);
     
       if(frappe=='q')
        {
            printf("test ok\n");
        }
     
        else
        {}
      }        
    pthread_join(thread, NULL);
     
    ...
     
    void* touche(void* data)
    {
       int *frappe = (int *)data;
     
       while(1)
       {
       *frappe=getch();
       }  
    }

  4. #4
    Membre éprouvé
    Inscrit en
    Juin 2008
    Messages
    91
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 91
    Par défaut
    Oui l'idée n'était très différente de ça, sauf que tu n'arrête pas le thread qui lit la socket, il faut vérifier la saisie juste après le getch, si c'est un 'q' tu arrête le thread (tu le détruits). Ou si tu veux sortir du programme tu mets un exit(0) (sans oublier de libérer les threads que tu as créé de la mémoire). Logiquement ça marche.

    En ce qui est de la fonction recv() il est transparent pour toi que ce soit bloquante ou pas, c'est là l'intérrêt d'avoir utilisé un thread. Reste juste à bien les utiliser.
    Sinon j'ai lu dans le man de recv qu'elle pouvait être non bloquante mais il faut changer des option lors de l'ouverture de ta socket, je n'ai pas cresé plus loin.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 31
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 52
    Par défaut
    alors j'ai corrigé une petite erreur (fermeture de la fonction 'touche' si 'q' est utilisé)

    mais recv semble bien bloquant sur se point car normalement comme dit si j'appuie sur 'q' le programme devrait m'afficher "test ok" mais la rien. Temps que le programme ne reçois rien il se fiche de se qu'il y à après j'ai l'impression.

    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
    37
    38
    39
    40
    41
    42
     
    int frappe;
     
    pthread_t thread;
    pthread_create(&thread, NULL, touche, &frappe);
     
      while(1)
      {
       memset(buffa, '\0', sizeof(buffa)); 
       n = recv(s, buffa, sizeof(buffa) - 1, 0);
       printf("%s\n", buffa);
     
       if(frappe=='q')
        {
            printf("test ok\n");
        }
     
        else
        {}
      }        
    pthread_join(thread, NULL);
     
    ...
     
    void* touche(void* data)
    {
       int *frappe = (int *)data;
     
       while(1)
       {
       *frappe=getch();
     
    if(*frappe=='q')
        {
            break;
        }
     
        else
        {}
     
       }  
    }

  6. #6
    Membre éprouvé
    Inscrit en
    Juin 2008
    Messages
    91
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 91
    Par défaut
    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
    37
    38
     
    int frappe;
     
    pthread_t thread;
    pthread_create(&thread, NULL, touche, &frappe);
     
      while(1)
      {
            memset(buffa, '\0', sizeof(buffa)); 
            n = recv(s, buffa, sizeof(buffa) - 1, 0);
            printf("%s\n", buffa);
      }        
    pthread_join(thread, NULL);
     
    ...
     
    void* touche(void* data)
    {
       int *frappe = (int *)data;
     
       while(1)
       {
       *frappe=getch();
     
        if(*frappe=='q')
        {
            printf("test ok\n");
     
            //c'est à ce niveau qu'il faudrait quitter ton application (ou autre traitements associés à l'appui sur 'q')
     
            break;
        }
     
        else
        {}
     
       }  
    }

Discussions similaires

  1. Réponses: 15
    Dernier message: 28/01/2005, 04h46
  2. Réponses: 3
    Dernier message: 24/01/2005, 11h57
  3. Simuler l'appui sur une touche, au niveau système
    Par debutant java dans le forum AWT/Swing
    Réponses: 5
    Dernier message: 13/08/2004, 12h51
  4. [SQL] Conditions sur une date dans une requete
    Par poufouille dans le forum Bases de données
    Réponses: 4
    Dernier message: 17/03/2004, 14h25
  5. Appui prolongé sur une touche.
    Par semenzato dans le forum MFC
    Réponses: 7
    Dernier message: 16/01/2004, 12h47

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