web-dev-qa-db-fra.com

Getch getch () non bloquantes (), ncurses

Je rencontre des problèmes d'obtenir des ncurses () à bloquer. L'opération par défaut semble être non bloquante (ou avez-elle oublié une initialisation)? J'aimerais que cela fonctionne comme getch () dans Windows. J'ai essayé diverses versions de

timeout(3000000);
nocbreak();
cbreak();
noraw();
etc...

(pas tout en même temps). Je préférerais ne pas utiliser (explicitement) utiliser WINDOW, si possible. A while boucle autour de getch (), la vérification d'une valeur de retour spécifique est OK aussi.

23
Jonas Byström

La bibliothèque de CurseSe est une transaction. Vous ne pouvez pas simplement tirer une routine et espérer le meilleur sans initialiser correctement la bibliothèque. Voici un code qui bloque correctement getch():

#include <curses.h>

int main(void) {
  initscr();
  timeout(-1);
  int c = getch();
  endwin();
  printf ("%d %c\n", c, c);
  return 0;
}
36
Norman Ramsey

De ne page d'homme (accent ajouté):

Les routines timeout et wtimeout Réglez le blocage ou la lecture non bloquante pour une fenêtre donnée. Si delay est négatif, le blocage de la lecture est utilisé (c'est-à-dire qui attend indéfiniment pour la saisie).

9
Rob Kennedy

Vous devez appeler initscr() ou newterm() pour initialiser les malédictions avant de fonctionner. Cela fonctionne bien pour moi:

#include <ncurses.h>

int main() {
    WINDOW *w;
    char c;

    w = initscr();
    timeout(3000);
    c = getch();
    endwin();

    printf("received %c (%d)\n", c, (int) c);
}
9
cjs