Турбо Паскаль 6.0




Пул надежности.


Turbo Vision устанавливает фиксированное количество памяти (по умолчанию 4К) в конце кучи, называемое пулом надежности. Если распределение памяти в куче достигает пула надежности, функция Turbo Vision LowMemory возвращает True. Это означает, что последующие распределения ненадежны и могут привести к ошибке. Чтобы использование пула надежности давало эффект, пул должен быть больше, чем максимальное атомарное распределение. Другими словами, он должен быть достаточно большим, чтобы все распределения между проверками LowMemory были успешными; 4К должны удовлетворять большинство программ. (Размер пула надежности устанавливается переменной LowMemSize). Использование традиционного подхода при распределении памяти создает диалоговое окно:

OK := True; R.Assign(20,3,60,10); D := New(Dialog, Init(R, 'My dialog')); if D <> nil then begin with D^ do begin R.Assign(2,2,32,3); Control := New(PStaticText, Init(R, 'Do you really wish to do this?')); if Control <> nil then Insert(Control) else OK := False; R.Assign(5,5,14,7); Control := New(PButton, Init(R, '~Y~es', cmYes)); if Control <> nil then Insert(Control) else OK := False; R.Assign(16,6,25,7); Control := New(PButton, Init(R, '~N~o', cmNo)); if Control <> nil then Insert(Control) else OK := False; R.Assign(27,5,36,7); Control := New(PButton, Init(R, '~C~ancel', cmCancel)); if Control <> nil then Insert(Control) else OK := False; end; if not OK then Dispose(D, Done); end;

Заметим, что переменная OK используется для указания ошибочных распределений. Если произошла ошибка, все диалоговое окно должно быть удалено. Вспомним, что удаление диалогового окна так же удаляет все его подэлементы. С другой стороны, с пулом надежности весь этот блок кода может интерпретироваться как атомарная операция и код изменяется:

R.Assign(20,3,60,10); D := New(Dialog, Init(R, 'My dialog')); with D^ do begin R.Assign(2,2,32,3); Insert(New(PStaticText, Init(R, 'Do you really wish to do this?'))); R.Assign(5,5,14,7); Insert(New(PButton, Init(R, '~Y~es', cmYes))); R.Assign(16,6,25,7); Insert(New(PButton, Init(R, '~N~o', cmNo))); R.Assign(27,5,36,7); Insert(New(PButton, Init(R, '~C~ancel', cmCancel))); end; if LowMemory then begin Dispose(D, Done); OutOfMemory; DoIt := False; end; else DoIt := DeskTop^.ExecView(D) = cmYes;

Поскольку пул надежности достаточно велик для распределения всего диалогового окна, которое требует менее 4К, этот код может предполагать, что все распределения успешны. После того, как диалоговое окно полностью распределится, проверяется переменная LowMemory, и если она True, то все диалоговое окно уничтожается; иначе используется.




Содержание  Назад  Вперед