Чтение онлайн

на главную - закладки

Жанры

Основы программирования в Linux
Шрифт:

Оптимизация обновлений экрана

Как вы видели в примере из упражнения 6.4, обновление множественных окон требует некоторой ловкости, но не слишком обременительно. Но может возникнуть более серьезная проблема, если нуждающийся в обновлении терминал подключен через медленное сетевое соединение. К счастью, в наши дни с ней сталкиваются очень редко, но ее обработка настолько легка, что мы рассмотрим ее просто для полноты картины.

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

wnoutrefresh
и
doupdate
:

#include <curses.h>

int wnoutrefresh(WINDOW *window_ptr);

int doupdate(void);

Функция

wnoutrefresh
определяет, какие символы необходимо отправить на экран, но не отправляет их на самом деле. Функция
doupdate
действительно отправляет изменения на терминал. Если вы просто вызовите
wnoutrefresh
, а за ней тут же функцию
doupdate
, эффект будет такой же, как при вызове функции
wrefresh
. Однако если вы хотите перерисовать ряд окон, то можете вызвать функцию
wnoutrefresh
для каждого окна (конечно, в нужном порядке) и затем вызвать
doupdate
только после последнего вызова
wnoutrefresh
. Это позволит библиотеке curses выполнить расчеты, связанные с обновлением экрана, по очереди для каждого окна и только после этого вывести обновленный экран. Такой подход почти всегда позволяет curses минимизировать количество символов, нуждающихся в пересылке.

Вложенные окна

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

#include <curses.h>

WINDOW *subwin(WINDOW *parent, int num_of_lines, int num_of_cols,

 int start_y, int start_x);

int delwin(WINDOW *window_to_delete);

У функции

subwin
почти такой же список параметров, как у функции
newwin
, и удаляются вложенные окна так же, как другие окна с помощью вызова
delwin
. Для записи во вложенные окна, как и в новые окна, вы можете применять ряд функций
mvw
. На самом деле большую часть времени вложенные окна ведут себя почти так же, как новые окна, но есть одно важное отличие: подокна самостоятельно не хранят отдельный набор экранных символов; они используют ту же область хранения символов, что и родительское окно, заданное при создании вложенного окна. Это означает, что любые изменения, сделанные во вложенном окне, вносятся и в лежащее в основании родительское окно, поэтому, когда подокно удаляется, экран не меняется.

На первый взгляд вложенные окна кажутся бесполезным экспериментом. Почему не изменять просто родительское окно? Основная сфера их применения — предоставление простого способа прокрутки другого окна. Потребность в прокрутке небольшой области экрана удивительно часто возникает при написании программ с использованием curses. Создав вложенное окно и прокручивая его, вы добьетесь желаемого результата.

Примечание

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

touchwin
для родительского окна.

Выполните упражнение 6.5.

Упражнение 6.5. Вложенные окна

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

1. Начальная секция кода программы subscl.c инициализирует отображение базового окна с некоторым текстом:

#include <unistd.h>

#include <stdlib.h>

#include <curses.h>

int main {

 WINDOW *sub_window_ptr;

 int x_loop;

 int y_loop;

 int counter;

 char a_letter = '1';

 initscr;

 for (y_loop = 0; y_loop < LINES - 1; y_loop++) {

for (x_loop = 0; x_loop < COLS - 1; x_loop++) {

mvwaddch(stdscr, y_loop, x_loop, a_letter);

a_letter++;

if (a_letter > '9') a_letter = '1';

}

 }

2. Теперь создайте новое подокно с прокруткой. Как рекомендовалось, вам следует перед обновлением экрана "коснуться" родительского окна:

 ub_window_ptr = subwin(stdscr, 10, 20, 10, 10);

 scrollok(sub_window_ptr, 1);

 touchwin(stdscr);

 refresh;

 sleep(1);

3. Сотрите содержимое вложенного окна, выведите в нем текст и обновите его. Прокрутка текста обеспечивается циклом:

 werase(sub_window_ptr);

 mvwprintw(sub_window_ptr, 2, 0, "%s", "This window will now scroll");

 wrefresh(sub_window_ptr);

 sleep(1);

 for (counter = 1; counter < 10; counter++) {

wprintw(sub_window_ptr, "%s", "This text is both wrapping and \

scrolling.");

wrefresh(sub_window_ptr);

sleep(1);

 }

4. Завершив цикл, удалите вложенное окно и обновите основной экран:

 delwin(sub_window_ptr);

 touchwin(stdscr);

 refresh;

 sleep(1);

 endwin;

 exit(EXIT_SUCCESS);

}

К концу программы вы увидите вывод, показанный на рис. 6.6.

Рис. 6.6 

Как это работает

Поделиться:
Популярные книги

Эволюционер из трущоб. Том 14

Панарин Антон
14. Эволюционер из трущоб
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Эволюционер из трущоб. Том 14

Старая школа рул

Ромов Дмитрий
1. Второгодка
Фантастика:
альтернативная история
6.00
рейтинг книги
Старая школа рул

Газлайтер. Том 31

Володин Григорий Григорьевич
31. История Телепата
Фантастика:
боевая фантастика
попаданцы
альтернативная история
фэнтези
6.25
рейтинг книги
Газлайтер. Том 31

Социология

Гидденс Энтони
Научно-образовательная:
обществознание
5.00
рейтинг книги
Социология

Чехов

Гоблин (MeXXanik)
1. Адвокат Чехов
Фантастика:
фэнтези
боевая фантастика
альтернативная история
5.00
рейтинг книги
Чехов

Падение Берлина, 1945

Бивор Энтони
Документальная литература:
биографии и мемуары
6.80
рейтинг книги
Падение Берлина, 1945

Вторжение

Гагарин Станислав Семенович
Фантастика:
детективная фантастика
4.50
рейтинг книги
Вторжение

Путь эльдар: Омнибус

Торп Гэв
Warhammer 40000
Фантастика:
эпическая фантастика
4.50
рейтинг книги
Путь эльдар: Омнибус

Ответная операция. В погоне за Призраком

Ардаматский Василий Иванович
11. Библиотека приключений
Проза:
военная проза
5.00
рейтинг книги
Ответная операция. В погоне за Призраком

ЖЛ 9

Шелег Дмитрий Витальевич
9. Живой лёд
Фантастика:
фэнтези
боевая фантастика
5.00
рейтинг книги
ЖЛ 9

Одержимый

Джеймс Питер
Top Thriller
Детективы:
триллеры
маньяки
8.67
рейтинг книги
Одержимый

Танцоры в конце времени

Муркок Майкл Джон
Фантастика:
фантастика: прочее
6.25
рейтинг книги
Танцоры в конце времени

Вечный. Книга V

Рокотов Алексей
5. Вечный
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Вечный. Книга V

Жребий брошен

Прозоров Александр Дмитриевич
10. Ведун
Фантастика:
фэнтези
8.90
рейтинг книги
Жребий брошен