Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Использование отображаемых файлов




FILE_SHARE_READ or FILE_SHARE_WRITE,nil,

OPEN_EXISTING, FILE_ATTRIBUTE_NOPMAL,0);

if hDev=INVALID_HANDLE_VALUE then begin

memo1.Lines.Add(' Ошибка открытия файла Windows');

Exit;


end; try

Getmem(Buffer, FilSize);

ReadFile {hDev ,Buffer,FilSize, nb, nil);

Memo1.Lines.Add('Прочитано байтов'+inttostr(nb)); Memo1.Lines.Add('Прочитаны числа1); sNumber:='';

FOR I:=0 TO FilSize DO BEGIN r:=buf(@buffer)[I]; if chr(r) in ['0'..'9'] then

sNumber:=sNumber+chr(r) else begin

if length(sNumber)>0 then Memo1.Lines.Add(sNumber); sNumber:=''; end; END; finally

CloseHandle(hDev); end; end;

procedure TForm1.FormDeactivate (Sender: TObject); begin

FreeMem(Buffer,FilSize); end; end.

В данной программе вначале определяется количество байт в исходном файле, которое включает в себя все символы, содержащиеся в файле, в том числе и разделители, т.е. отдельные цифры чисел, пробелы, #13, #10. Далее этот файл открывается как файл Windows. Байты считываются в переменную Buffer и с помощью преобразования типа Pointer в тип Array of byte восстанавливаются в исходные числа. В примере показан один из вариантов работы с типом Pointer.

В Windows под памятью подразумевается не только оперативная память (ОЗУ), но также и память, резервируемая операционной системой на жест­ком диске. Этот вид памяти называется виртуальной памятью. Посредст­вом страничной системы (paging system) подкачки в такую память на же­стком диске отображаются код и данные. По мере необходимости требуе­мый фрагмент виртуальной памяти переносится из страничного файла в ОЗУ и, таким образом, становится доступным для выполнения. Данный механизм отображения можно применить и для любого другого файла, сделав его со­держимое частью адресного пространства.


 

 


Для выделения фрагмента виртуальной памяти должен быть создан спе­циальный системный объект, называемый отображаемым файлом. Отобра­жаемый в адресное пространство дескриптор объекта создается операцион­ной системой при вызове следующей функции Windows API: function CreateFileMappingA(hFile: THandle; lpFileMappingAttributes: PSecurityAttributes; flProtect, dwMaximumSizeHigh, dwMaximum-SizeLow:DWORD; lpName: PAnsiChar): THandle; stdcall;.

Первый параметр соответствует дескриптору открытого при помощи функции createFile файла. Второй параметр является указателем на структуру с данными по защите файла. Посредством параметра f lProtect указывается тип доступа к файлу, например, page_readwritk. С помощью параметров dwMaximumSizeHigh, dwMaximumSizeLow задается выделяемое пространство виртуальной памяти. Если отображается весь файл, то их зна­чения можно задать равными нулю (при условии, что файл намного меньше 4 Гбайт). Последний параметр представляет собой имя объекта файлового отображения (применяется при вызовах из разных, но одновременно исполь­зующих созданный объект, программ).

Следующий этап построения отображения - спроецировать данные фай­ла в адресное пространство. Этой цели служит следующая функция: func­tion MapViewOfFile(hFileMappingObject: THandle; dwDesiredAc-cess: DWORD; dwFileOffsetHigh, dwFileOffsetLow, dwNumberOf-BytesToMap: DWORD): Pointer; stdcall;.

Первый параметр является дескриптором созданного объекта файлового отображения. С помощью второго параметра определяется режим доступа к объекту (file_map_write, filb_map_read, file_map_all_access). По­средством третьего и четвертого параметров задается смещение отображае­мого участка относительно начала файла (чаще всего оба параметра равны нулю). Пятый параметр определяет количество байт данных файлового ото­бражения - если равен нулю, то отображаются все данные, выделенные при этом функцией CreateFileMappingA.

Функция MapViewOfFile вернет начальный адрес (тип возвращаемого результата - Pointer) данных в памяти. Далее можно работать с исходным файлом как с обычной памятью.

По окончании работы с отображаемым в памяти файлом необходимо вернуть занятое адресное пространство, используя функцию function DnmapViewOfFile(lpBaseAddress: Pointer): BOOL; stdcall;, где lpBaseAddress - используемый выше указатель. Последняя операция, ко­торую надо выполнить, - закрыть полученный выше дескриптор. Эта опера­ция выполняется путем вызова еще одной функции Windows API: function CloseHandle(hObject: THandle): BOOL; stdcall;.


ПРИМЕР ПРИЛОЖЕНИЯ 26

Анализ качества продукции на некотором производстве проводится пу­тем измерения при некоторых условиях х некоторого признака у. Пусть оп­ределенная совокупность x,y,My,Dy, состоящая из n= 8 элементов, записа­на в типизированный файл DatPro.dat, причем первоначально My, Dy равны нулю и их предстоит вычислить. Если производство работает нормально, то совокупность точек х, у должна ложиться на прямую линию. Методом наи­меньших квадратов необходимо постоянно контролировать на производстве этот факт, т.е. если ошибка отклонения функции y=f(x) от прямой линии меньше, чем некоторая величина µ то качество выпускаемой продукции в пределах нормы, иначе необходимо принимать меры по изменению, напри­мер, технологического режима. Пусть µ=0,08. В данном случае применяются следующие формулы расчета:

 

В этих формулах обозначено, например, Расчет ошибки выполняется по следующей формуле: примера представлены на рис. 62. Рис.62




Исходные данные необходимо записать с помощью отдельной програм­мы в типизированный файл. Все необходимые сведения по работе с ото­бражаемыми файлами приводятся в следующем тексте программы:

unit Unit25;

interface

uses Windows, Messages, SysUtils, Variants, Classes,

Graphics, Controls, Forms, Dialogs, Buttons, StdCtrls;

Type TForm1 = class(TForm)

Memo1: TMemo;

Button1: TButton;

BitBtnl: TBitBtn;

Memo2: TMemo;

Label1: TLabel;

Label2: TLabel;

procedure Button1Click(Sender: TObject);

public

hFile:THandle; hFileMapObject: THandle;

PFileMem:Pointer;

end;

datP=record

x,y,My,Dy:real;

end;

const n=8;

var Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

type buf=array of datP;

var FilName:string; r:datP; s:string; i:byte;

ff:file of datP; a,b, Sx, Sy, Sx2, Sxy.-real;

begin

FilName:='DatPro.dat'; {$1-}

AssignFile(ff,FilNaitte);

Reset(ff); {$1+}

if IOResult<>O then begin

Memo1.Lines.Add('Ошибка открытия файла'); Exit;

­end;

for i:=l to n do begin;

 

 


Read(ff,r);

s:='';

with r do begin s:=FormatFloat('0.00',x)+FormatFloat(' 0.00',y)+

FormatFloat(' 0.00',My)+ FormatFloat(' 0.00',Dy); Memo1.Lines.Add(s);

end;

end;

CloseFile(ff); PFileMem:=nil;

hFile:=CreateFileA(pChar(FilName),GENERIC_READ or GENERICJWRITE, FILE_SHARE_READ or FILE_SHARE_WRITE,

nil,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,0);

if hFile=INVALID_HANDLE_VALUE then begin

memo2.Lines.Add('Ошибка открытия файла Windows'); Exit; ­end;

hFileMapObject:=CreateFileMapping(hFile, nil,

PAGE_READWRITE, 0,0,'ShareMem');

if hFileMapObject = INVALID_HANDLE_VALUE then begin memo2.Lines.Add('Ошибка открытия файла отображения'); CloseHandle(hFile);

Exit; end;

PFileMem:= MapViewOfFile(hFileMapObject,

FILE_MAP_ALL_ACCESS,0, 0,n*Sizeof(datP));

if PFileMem = nil then begin

memo2.Lines.Add('Ошибка открытия отображения в памяти'), CloseHandle(hFileMapObject);

CloseHandle(hFile);

Exit;

end;

s:=’’;

Sx:=0.0;

Sy:=0.0;

Sx2:=0.0;

Sxy:=0.0;

FOR I:=0 TO n-1 DO

with buf(PFileMem)[I] do begin

Sx:=Sx+x;

Sx2:=Sx2+sqr(x);

Sy:=Sy+y;

Sxy:=Sxy+y*x;

end;

a:=(Sy*Sx2-Sxy*Sx)/(n*Sx2-sqr(Sx));

b:=(n*Sxy-Sy*Sx)/(n*Sx2-sqr(Sx));

Sy:=0.0;

FOR I:=0 TO n-1 DO;


with buf(PFileMem)[I] do begin

My:=a+b*x;

Dy:=My-y;

Sy:=Sy+sqr(Dy); end;

Sxy:=sqrt(Sy/(n-l));

memo2.Lines.Add('Ошибка='+FormatFloat(' 0. 00000',Sxy));

if Sxy>0.08 then

memo2.Lines.Add('В системе производства сбои...')

else memo2.Lines.Add('B производстве все в порядке!');

if PFileMem<>nil then UnMapViewOfFile (PFileMem);

if hFileMapObjeot<>O then CloseHandle(hFileMapObject);

if hFile=0 then CloseHandle(hFile);

AssignFile(ff,FilName);

Reset(ff);

Memo2.Lines.Add(s);

for i:=l to n do begin;

Read(ff,r);

with r do begin

s:=FormatFloat('0.00',x)+FormatFloat(0.00', y)+

FormatFloat(' 0.0000',My)+ FormatFloat(‘ 0.0000',Dy);

memo2.Lines.Add(s);

end;

end;

CloseFile(ff);

end;

end.

Следует обратить внимание на то, какое преобразование типов было ис­пользовано для работы с выделенной под файл памятью. Самым замечатель­ным является то, что любые изменения в памяти мгновенно отражаются в отображенном файле. Так, если второй раз запустить программу на выпол­нение, то исходные данные (см. рис. 62) будут отражать уже не нулевые зна­чения величин My и Dy.




Поделиться с друзьями:


Дата добавления: 2014-12-29; Просмотров: 352; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.031 сек.