Операционная система UNIX. Руководство программиста

       

Подпрограммы wnoutrefresh( ) и doupdate( )


Как было сказано ранее, подпрограмма refresh() пересылает данные с stdscr на экран терминала. refresh() является макросом, который расширяется в wrefresh (stdscr), о чем также упоминалось в разделах Что нужно программе для работы с curses и Еще об окнах и подпрограмме refresh().

Подпрограмма wrefresh() предназначена для пересылки данных из окна (будь то stdscr или созданное пользователем) на экран терминала; она вызывает подпрограммы wnoutrefresh() и doupdate(). Аналогичным образом, prefresh() пересылает данные из спецокна на экран, обращаясь к pnoutrefresh() и doupdate().

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

лишь однажды.

#include <curses.h>

main () { WINDOW *w1, *w2; initscr (); w1 = newwin (2, 6, 0, 3); w2 = newwin (1, 4, 5, 4); waddstr (w1, "Bulls"); wnoutrefresh (w1); waddstr (w2, "Eye"); wnoutrefresh (w2); doupdate (); endwin (); }

В начале этой программы объявляются новые окна. Операторы

w1 = newwin (2, 6, 0, 3); w2 = newwin (1, 4, 5, 4);

объявляют два окна, которые называются w1 и w2, передавая некоторые описания подпрограмме newwin(), которая подробнее описана ниже.

Ниже показано действие wnoutrefresh() и doupdate() на эти два окна и на виртуальный и физический экраны.



Содержание раздела