ncurses, print et contemporain acquièrent des cordes

Un programme écrit en C utilise ncurses . Un cycle while permet de vérifier en permanence si un nouveau message est arrivé dans une queue. Si c’est le cas, le message est imprimé à l’écran, puis supprimé de la queue:

 while (condition) { if (queue_not_empty) { printw(element_from_queue); refresh(); remove(element_from_queue); } } 

Dans le même temps, toutefois, le programme devrait pouvoir acquérir une chaîne d’entrée auprès de l’utilisateur, puis la stocker dans le char message[100] tableau char message[100] par l’intermédiaire d’un scanw . Mais si je mets

 while (condition) { if (queue_not_empty) { printw(element_from_queue); refresh(); remove(element_from_queue); } scanw(message); } 

le cycle s’arrête jusqu’à ce que l’utilisateur ne tape pas de chaîne et le programme imprime les nouveaux messages de la queue uniquement après une entrée utilisateur. Ça ne devrait pas être comme ça! Les messages de la queue peuvent arriver à tout moment et doivent être imprimés. les messages utilisateur peuvent arriver à tout moment et doivent être stockés dans le tableau.

Je voudrais éviter la création d’un autre thread, car ncurses devient étrange avec plusieurs threads. Quoi qu’il en soit, il me faudrait deux cycles “contemporains”, un pour imprimer les messages et un pour lire les données de l’utilisateur.

Peut-il y avoir une solution?

En d’autres termes: est-il possible avec ncurses d’imprimer certaines sorties et d’obtenir plusieurs caractères saisis par l’utilisateur dans le même écran, dans le même fil ?

ncurses fournit des fonctions permettant de lire un seul caractère avec un délai d’attente (ou même aucun délai ). Celles-ci ne sont pas utiles avec scanw (qui bloque toujours, en attendant plusieurs caractères):

  • Lorsque vous utilisez un délai d’attente, getch renvoie ERR plutôt qu’un caractère à l’expiration du délai d’attente.
  • scanw peut utiliser getch interne, mais n’a aucun moyen de continuer lorsque getch renvoie ERR .

Plutôt que de bloquer , vous pouvez rechercher une entrée. Si aucun caractère n’est disponible dans un intervalle de temps donné, votre programme abandonne (pour le moment) et fait quelque chose de plus utile que d’attendre des caractères. Les applications qui recherchent une entrée peuvent être écrites pour accepter les caractères un par un, en les ajoutant à un tampon jusqu’à ce que l’utilisateur appuie sur Entrée , puis en sscanf sur le texte complété.

Le sscanf est utilisé (qui lit à partir d’une chaîne ) au lieu de lire directement à l’ écran avec scanw .