Вывод терминала С++ с постоянной областью/строкой состояния

У меня есть более крупное приложение C++, которое полностью управляется консолью/терминалом. Печатается много отладочной информации, однако она начинает запутываться. Важная информация теряется между общей информацией о состоянии различных модулей. Отключение этих выходов невозможно, так как они фактически являются важным индикатором неисправностей.

Вместо этого я подумал, что может быть более полезным «разделить» экран, т.е. иметь определенный вывод в своего рода дополнительной области на экране (терминал). Это можно рассматривать как строку состояния (возможно, несколько строк).

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

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

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

  • иметь область фиксированного размера (верхние N строк) на терминале, выводя некоторую информацию о состоянии
  • остальная часть экрана показывает вывод printf
  • при прокрутке область/строка состояния фиксированного размера не должна иметь неблагоприятного эффекта (т.е. я хочу правильно прокручивать вывод printf, не теряя его!)

Код будет работать на компьютерах с Linux на ноутбуке (обычно с использованием терминала gnome) или удаленно через соединение ssh.


person fasel    schedule 17.03.2012    source источник


Ответы (1)


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

В голове у меня есть две идеи для вас (помимо преобразования вашего приложения в ncurses):

  • Вы можете использовать какой-нибудь сумасшедший компоновщик или трюки #define, чтобы заменить все вызовы printf и т. д. версиями, использующими ncurses для записи на экран. Я не рекомендую это.

  • Вы можете направить вывод в приложение, которое принимает ввод на стандартный ввод, а затем использует ncurses для отображения ввода на основе какого-либо регулярного выражения. (например, строки, начинающиеся с «ошибки», идут в верхнюю половину экрана, а все остальные — в нижнюю).

Если вы хотите использовать буфер прокрутки терминала, вам понадобится секция прокрутки в верхней части окна. ncurses может не подходить для этого требования, поскольку он был разработан в эпоху, когда терминалы не имели буферов обратной прокрутки.

person Craig    schedule 20.03.2012