ncurses, печать и современные штрихи

Программа, написанная на C, использует ncurses . Цикл while используется для постоянной проверки наличия нового сообщения в очереди: если это так, сообщение печатается на экране, а затем удаляется из очереди:

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

В то же время, однако, программа должна иметь возможность получить входную строку от пользователя, а затем сохранить ее в char message[100] через scanw . Но если я поставлю

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

цикл остановится, пока пользователь не наберет строку, и программа будет печатать новые сообщения очереди только после ввода пользователем. Это не должно быть так! Сообщения очереди могут поступать в любое время и должны быть распечатаны; пользовательские сообщения могут появиться в любое время и должны быть сохранены в массиве.

Я хотел бы избежать создания другого streamа, потому что ncurses становится странным с несколькими streamами. Во всяком случае, мне понадобится два «современных» цикла, один для печати сообщений и один для чтения пользовательского ввода.

Может ли быть решение?

Другими словами: возможно ли, чтобы ncurses напечатал некоторый вывод и чтобы получить несколько символов, введенных пользователем на том же экране, в том же streamе ?

ncurses предоставляет функции для чтения одного символа с тайм-аутом (или даже без задержки ). Это не полезно для scanw (который всегда блокирует, ожидая нескольких символов):

  • при использовании таймаута getch возвращает ERR а не символ, когда истекает время ожидания.
  • scanw может использовать getch внутри, но не имеет возможности продолжить, когда getch возвращает ERR .

Вместо того, чтобы блокировать , вы можете опросить ввод. Если ни один символ не доступен в течение заданного интервала времени, ваша программа перестает (на данный момент) и делает что-то более полезное, чем ожидание символов. Приложения, которые опрос для ввода могут быть записаны для приема символов по одному, добавляя их в буфер до тех пор, пока пользователь не нажмет Enter , а затем запустите sscanf в завершенном тексте.

Используется обычный C sscanf (который читается из строки ), а не прямое считывание с экрана с помощью scanw .