Гостевая книга Ассемблер Delphi

Освобождение ресурсов отображения.

После использования отображенных данных ресурсы окна отображения нужно освободить функцией function UnMapViewOfFile(IpBaseAddress: Pointer): BOOL; единственный параметр обращения к которой должен содержать адрес первого отображенного байта, т. е. адрес, возвращаемый функцией MapViewOfFile. Закрытие объекта отображения и самого файла осуществляется обращением к функции

function CloseHandle(hObject: THandle).

Пример использования

В следующем листинге приводится текст модуля, который создает окно, показанное на рис. 11.1.

Программа создает дисковый файл, состоящий из 100000 случайных вещественных чисел (длину файла можно выбрать другой, если изменить значение редактора длина массива). Файл с именем test.dat создается путем отображения файла в память (кнопка память) и традиционным способом (кнопка Файл). В обоих случаях показывается время счета (процессор 400 МГц, память 64 Мбайт). Чем больше частота и память, тем больше будет разница во времени.

Рис. 11.1. Окно демонстрационнойпрограммы

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, Spin;

type

TFormI = class (TForm)

btMem: TButton;

btFile: TButton;

se: TSpinEdit;

Labell: TLabel;

pb: TProgressBar;

Label2: TLabel;

IbMem: TLabel;

IbFile: TLabel;

procedure btMemClick(Sender: TObject);

procedure btFileClick(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.btMemClick(Sender: TObject);

// Создание файла методом его отображения

type

PReal = ^Real;

var

HFile, HMap: THandle;

AdrBase, AdrReal: PReal;

k: Integer;

FSize: Cardinal;

BegTime: TDateTime;

begin

BegTime := Time; // Засекаем время пуска

// Готовим ProgressBar:

pb.Max := se.Value;

pb.Position := 0;

pb.Show;

FSize := se.Value * SizeOf(Real); // Длина файла HFile := FileCreate('test.dat'); // Создаем файл

if HFile = 0 then // Ошибка: возбуждаем исключение

raise Exception.Create('Ошибка создания файла');

try

// Отображаем файл в память HMap := CreateFileMapping(

HFile, NIL, PAGE_READWRITE, 0, FSize, NIL);

if HMap = 0 then // Ошибка: возбуждаем исключение

raise Exception.Create('Ошибка отображения файла');

try

// Создаем окно просмотра:

AdrBase := MapViewOfFile(

HMap, FILE_MAP_WRITE, О, О, FSize) ;

if AdrBase = NIL then // Ошибка: возбуждаем исключение

raise Exception.Create('Невозможно просмотреть файл');

// Сохраняем начальный адрес для правильной ликвидации

// окна просмотра:

AdrReal := AdrBase;

for k := 1 to se.Value do

begin

AdrReal^ := Random; // Помещаем в файл новое число

// Перед наращиванием текущего адреса необходимо

// привести его к типу Integer или Cardinal:

AdrReal := Pointer(Integer(AdrReal) + SizeOf(Real));

IbMem.Caption := IntToStr(k);

pb.Position := k;

Application.ProcessMessages;

end;

// Освобождаем окно просмотра:

UnmapViewOfFile(AdrBase) finally

// Освобождаем отображение CloseHandle(HMap)

end

finally

// Закрываем файл CloseHandle(HFile)

end;

// Сообщаем время счета pb.Hide;

IbMem.Caption := TimeToStr(Time-BegTime)

end;

procedure TFormI.btFileClick(Sender: TObject) ;

// Создание файла обычным методом var

F: File of Real;

k: Integer;

BegTime: TDateTime;

R: Real; // Буферная переменная для обращение к Write

begin

BegTime := Time; // Засекаем начальное время счета // Готовим ProgressBar:

pb.Max := se.Value;

pb.Position := 0;

pb.Show;

// Создаем файл:

AssignFile(F, 'test.dat');

Rewrite(F);

for k := 1 to se.Value do

begin

R := Random; // Параметрами обращения к Write

Write(F, R); // могут быть только переменные

IbFile.Caption := IntToStr(k);

pb.Position := k;

Application.ProcessMessages;

end;

CloseFile(F) ;

pb.Hide;

IbFile.Caption :=TimeToStr(Time-BegTime)

end;

end.

назад - Вперёд