2017-05-06 2 views
0

Je veux sortir le code ASCII de la dernière touche que j'ai appuyée, toutes les x secondes.Afficher quelque chose toutes les x secondes avec une sortie différente

A titre d'exemple:

Si je presse un (97), le terminal devrait afficher 97 tous les x secondes. Quand maintenant j'appuie sur w (119), le programme devrait maintenant imprimer le 119 au lieu du 97. Jusqu'ici mon programme imprime juste la première clef que j'ai pressée.

Voici la principale et l'autre méthode:

int main(int argc, char const *argv[]){ 
     printf("Hello World!"); 
     while(1){ 
      movePlayer(); 
      fflush(stdout); 
      sleep(1); 
     } 
     return 0; 
} 

void movePlayer(){ 
    system("/bin/stty raw"); 
    int input = getchar(); //support_readkey(1000); 
    //fprintf(stdout, "\033[2J"); 
    //fprintf(stdout, "\033[1;1H"); 
    printf("\b%d",input); 
    system("/bin/stty cooked"); 
} 

EDIT:

Avec un peu de tests je l'ai maintenant une méthode qui permet de résoudre mon problème

int read_the_key(int timeout_ms) { 
    struct timeval tv = { 0L, timeout_ms * 1000L }; 
    fd_set fds; 
    FD_ZERO(&fds); 
    FD_SET(0, &fds); 
    int r = select(1, &fds, NULL, NULL, &tv); 
    if (!r) return 0; 

    return getchar(); 
} 
+0

c'est parce que 'getchar' attend exactement un caractère; vous devez utiliser 'read' à la place. –

Répondre

0

getchar() attend un seul caractère, de sorte que:

while(1){ 
    movePlayer(); // getchar() and printf() here 
    fflush(stdout); 
    sleep(1); 
} 

provoque ce comportement. Vous lisez un caractère, vous l'imprimez en movePlayer(). Ensuite, vider le tampon de sortie et aller dormir. Ensuite, vous répétez simplement, ce qui signifie que vous devez entrer à nouveau.

Enregistrez l'entrée et imprimez-la à nouveau, si vous le souhaitez. Cependant, votre fonction attend toujours pour attendre la nouvelle entrée.


Voici une tentative avec read() comme suggéré, mais il aura un comportement similaire à votre code tel qu'il est maintenant:

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 

int old_c = -1; 
char c[1] = {0}; 

void movePlayer(); 

int main(int argc, char const *argv[]){ 
     while(1) { 
     movePlayer(); 
     fflush(stdout); 
     sleep(1); 
     } 
     return 0; 
} 

void movePlayer(){ 
    system("/bin/stty raw"); 
    if(read(STDIN_FILENO, c, sizeof(c)) > 0) 
     old_c = (int)c[0]; 
    if(old_c == -1) 
     old_c = (int)c[0]; 
    printf("\b%d", old_c); 
    system("/bin/stty cooked"); 
} 

S'il vous plaît lire read() from stdin continuer. Vous pouvez indiquer read() pour combien de caractères attendre, puis revenir, mais comment saurez-vous si l'utilisateur a l'intention d'entrer un nouveau caractère pour commander read() pour attendre la saisie de l'utilisateur? En conséquence, je dirais que vous ne pouvez pas faire ce que vous voulez, du moins autant que je sache, avec une approche simple. Vous pourriez avoir votre programme de nourrir l'entrée périmée à stdin, de sorte que votre programme a l'impression qu'il lit l'entrée de l'utilisateur. Cependant, au cas où l'utilisateur entrerait de nouvelles entrées, votre programme devrait gérer ce cas avec soin.

+0

Ouais mais l'imprimer quand? Si vous êtes bloqué en attente de l'entrée de stdin, vous ne faites rien chaque seconde. –

+0

Exactement @BoundaryImposition, puisque sa fonction a 'getchar()', elle sera toujours bloquée! – gsamaras

+0

Merci pour votre aide. J'ai maintenant une solution, éditée dans mon post. – Fleksiu

0

Vous pouvez gestionnaire de SIGALARM de configuration, alarme de configuration après x secondes et afficher ce getchar retours dans le gestionnaire de