Особо следует остановиться на совместной работе модулей Graph и Overlay. При включении графических режимов в области кучи отводится место под графический драйвер и шрифты. Этим блокируется возможность изменения оверлейного буфера. Поэтому будет безопаснее инициализировать и регистрировать графические драйверы и шрифты только после запуска администратора оверлеев и назначения размера буфера.

<p>18.4.3. Принудительная очистка буфера</p>

Процедура OvrClearBuf служит для принудительной очистки оверлейного буфера. Ее действие эквивалентно выгрузке всех находящихся в текущий момент в буфере оверлейных подпрограмм. Сам администратор оверлеев эту процедуру никогда не вызывает. Но иногда ее вызов имеет смысл. Например, если отрабатывается фрагмент программы, не использующий оверлейных подпрограмм, можно освободить вызовом OvrClearBuf буфер и использовать его для хранения динамических данных (назначая им адреса «вручную», без вызовов GetMem или New). Адрес начала области буфера определяется как Ptr(OvrHeapOrg, 0), ее конец как Ptr(OvrHeapEnd, 0), где  OvrHeapOrg и OvrHeapEnd — предопределенные переменные модуля System, объявленные типам Word.

<p>18.5. Оптимизация работы оверлеев</p>

В Турбо Паскале версии 5.5 реализован специальный алгоритм оптимизации подгрузки наиболее часто используемых оверлейных процедур и функций. В оверлейном буфере в общем случае может разместиться несколько не самых крупных оверлейных модулей. Если их объявлено несколько, то, как правило, так и происходит. Администратор следит за заполнением буфера, передвигая в нем при необходимости подгрузки нового модуля уже загруженные модули. Передвижение происходит от начала к концу буфера. Если же таким способом места в начале буфера не освободить, то наиболее «долго» сидящий в буфере (он же ближний к концу буфера) оверлей выгружается (если он, конечно, не активен в данный момент), высвобождая часть буфера. Можно активизировать механизм оптимизации, нахо-

- 401 -

дящийся по умолчанию в отключенном состоянии. Он заключается в следующем: когда оверлей подходит близко к концу буфера, он ставится на «проверку». Если в течение некоторого «испытательного срока» происходит вызов подпрограммы, которая находится в данном оверлее, то ему будет дана «отсрочка» и он не будет выгружен из памяти. Вместо этого он будет переброшен в начало буфера и сможет сделать еще один «круг» по нему. Если же за это время вызов не поступит, то оверлей при первой же необходимости будет выгружен из памяти. Таким образом, наиболее часто используемые оверлеи хранятся как бы в кольцевом буфере, в то время как малоактивные выходят из буфера без задержек. Этими процессами управляют две подпрограммы модуля Overlay.

<p>18.5.1. Установка размера области испытаний</p>

Функция OvrGetRetry : LongInt возвращает текущий размер области испытаний. До вызова процедуры  OvrGetRetry будет всегда возвращать нуль.

Процедура  OvrSetRetry(Size : LongInt) устанавливает размер области испытаний в оверлейном буфере. Теперь при попадании оверлея в последние Size байт буфера он автоматически ставится на «испытание» стартовый размер области испытаний равен нулю, что, по сути, блокирует работу механизма испытаний. Определить размер области испытаний можно только методом проб и ошибок. В техническом описании Турбо Паскаля рекомендуется отводить под эту область немногим более трети буфера. Включение механизма оптимизации ускоряет работу администратора оверлеев, но немного замедляет обращения к хранящимся в оверлеях подпрограммам. Вызов процедуры  OvrSetRetry должен стоять после вызовов OvrInit и OvrInitEMS:

OvrInit(ovr_name); {инициализация администратора}

OvrInitEMS;  {попытка использовать EMS}

{Назначение области испытаний (и включение оптимизации):}

OvrSetRetry(OvrGetBuf div 3);

<p>18.5.2. Подсчет вызовов оверлеев</p>

Предопределенные переменные OvrTrapCount и OvrLoadCount типа Word, привносимые модулем Overlay, хранят статистику обращений к OVR-файлу. Их стартовые значения — нули. Переменная  OvrTrapCount хранит количество обращений к файлу в том случае, если нужный оверлейный модуль находится на диске или в буфере на «испытании».  Другая переменная, OvrLoadCount ведет подсчет количества загрузок оверлея. Сопоставление этих двух значений может помочь выбрать оптимальный размер «области испытаний» (отношение OvrLoadCount к  OvrTrapCount должно быть минимальным).

<p>18.6. Предопределенные переменные для работы с оверлеями</p>

Мы рассматривали переменную модуля Overlay OvrResult с набором констант-значений (см. разд. 18.3.2) и переменные OvrTrapCount и OvrLoadCount (разд. 18.5.2). Кроме них, определены еще тип и две переменные:

TYPE

OvrReadFunc = Function( OvrSeg : Word ) : Integer;

VAR

OvrReadBuf : OvrReadFunc;

OvrFileMode : Byte;

Перейти на страницу:

Поиск

Похожие книги