2017-01-11 7 views
0

Si nous prenons un compteur très simple en utilisant ncurses:entrée non-blocage dans gforth

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

int main(void) { 
    struct timespec start; 
    clock_gettime(CLOCK_REALTIME, &start); 
    initscr(); 
    cbreak(); 
    nodelay(stdscr, TRUE); 
    { 
    int key = -1; 
    struct timespec delay, now; 
    do { 
     clock_gettime(CLOCK_REALTIME, &delay); 
     delay.tv_sec = 0; 
     delay.tv_nsec = 1000L * 1000L * 1000L - delay.tv_nsec; 
     nanosleep(&delay, NULL); 
     clock_gettime(CLOCK_REALTIME, &now); 
     mvprintw(1, 1, "%ld\n", (long)(now.tv_sec - start.tv_sec)); 
     refresh(); 
     key = getch(); 
     if (key >= 0) 
     break; 
    } while (now.tv_sec - start.tv_sec < 60); 
    } 
    endwin(); 
    return 0; 
} 

il avorte après avoir appuyé sur une touche (OK, en raison de cbreak() en utilisant ctrl - C serait toujours travailler sans tout effort supplémentaire ...).

Mais nous pouvons rendre cela plus compliqué, comme ajouter une fonction pour mettre le compteur en pause ou le réinitialiser à la volée (+/- 1 seconde).

Nous avons absolument besoin d'une entrée clavier non bloquante pour cela.

Je me demande si c'est possible dans Gforth? OK, je sais comment attraper les interruptions comme SIGINT là, mais quelque chose comme ci-dessus, travaillant pour une clé ou une une clé prédéterminée?

+0

Je supprime la balise C car cette question IMO a peu à voir avec C (c'est-à-dire ne bénéficiera pas de l'attention des programmeurs C). N'hésitez pas à le rajouter si vous n'êtes pas d'accord. – jforberg

Répondre

2

Utilisez key?, returns a flag ce qui est vrai si une nouvelle entrée est disponible.

Vous pouvez augmenter le code suivant comme bon vous semble, mais je pense que cela explique l'idée de base de fonctionnement dans une boucle jusqu'à ce qu'une touche est enfoncée.

: run-until-key (--) 
    0 
    begin 
     \ place your terminal code here 
     ." Num:" dup . cr 
     1+ 
    key? until drop ; 

Si vous voulez attendre une clé spécifique, il suffit d'ajouter un si, avant la jusqu'à:

... 
key? if key 13 = else false then until 
... 

Vous pouvez également ajouter votre minuterie là.