КАТЕГОРИИ: Архитектура-(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 Гбайт). Последний параметр представляет собой имя объекта файлового отображения (применяется при вызовах из разных, но одновременно использующих созданный объект, программ). Следующий этап построения отображения - спроецировать данные файла в адресное пространство. Этой цели служит следующая функция: function 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; Просмотров: 376; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |