Терминальное приложение c ++ для одновременного ввода и вывода - PullRequest
2 голосов
/ 27 мая 2011

Я пытаюсь реализовать приложение, подобное клиенту чата, куда сообщения могут поступать, пока пользователь печатает свое собственное сообщение.

Я объясню, как я хочу, чтобы моя программа работала, на примере:До входящего сообщения:

>user partial input

После входящего сообщения:

>the new message
>user partial input(cursor is here)

Вместо того, что естественно происходит после входящего сообщения, это:

>user partial input the new message
>(cursor is here)

После этогопользователь все еще может использовать клавишу Backspace, чтобы удалить то, что он написал ранее, но это не отображается на экране, и в целом наблюдается беспорядок в пользовательском интерфейсе.

Есть ли способ достичь желаемого поведения без использования ncurses?

Спасибо.

Редактировать: Извините, я забыл написать, какова моя среда, это Cygwin.Спасибо за все ответы.

Ответы [ 4 ]

4 голосов
/ 27 мая 2011

В то время как ncurses может быть наиболее гибким и простым способом для достижения этой цели, вы можете сделать это самостоятельно с некоторой работой.

Вы должны самостоятельно решить вопрос с IO.Вы можете использовать «\ r», чтобы вернуться к началу строки без ncurses или какого-либо конкретного взаимодействия с терминалом платформы.

Общий поток будет:

  • У вас есть входцикл, который читает во входной буфер символьно.Поведение по умолчанию - отображать каждый символ.Получив новую строку, вы зафиксируете эту строку из буфера и напечатаете с новой строкой.
  • Если вы получили уведомление о входящем сообщении, вы должны напечатать «\ r», чтобы переместить курсор назад к началу строки, напечатать пробелы, чтобы очистить строку, а затем еще одну «\ r» для восстановления.поместите курсор в начало, напечатайте сообщение с новой строкой, а затем напечатайте текущий буферизованный ввод.

Здесь нужно рассмотреть множество краевых случаев, но ncurses - не единственный вариант.Насколько я тестировал, эта техника работает как в Windows, так и в Linux.

1 голос
/ 27 мая 2011

Не существует (практического) решения без использования графического интерфейса или ncurses.

Я написал нечто подобное с ncurses несколько лет назад.Он был минимальным (два простых окна), но менее 100 строк кода имели какое-либо отношение к ncurses, поэтому вряд ли это непреодолимое препятствие.

Проблема с ncurses заключается в том, что он выглядит (и является) несколько страннымпервый.Документация не так полезна, как могла бы быть, и не так уж много людей знают или заботятся о ней больше, поэтому, когда вы рисуете себя в углу, трудно найти помощь.Но если вы будете делать все просто, с вами все будет в порядке.

0 голосов
/ 27 мая 2011

Да, как говорится в комментариях, вам придется взаимодействовать с самим терминалом через ncurses, коды ANSI или (ужасный) Windows API.Нет никакого способа использовать стандартные потоки для достижения этого (будучи потоками они выполняют только ввод / вывод и не отображают или не видят курсор).

Кроме того, потоки предоставляют синхронный режим (блокирование) API, поэтому вы не можете читать из одного и писать в другой, не прибегая к потокам или реактору.

0 голосов
/ 27 мая 2011

Вы можете отправить экранированные управляющие последовательности на терминал самостоятельно, но это точно так же, как и повторная реализация ncurses:)

...