Delphi 6 アプリケーションと、メモリ マップ ファイルを共有してデータを転送する DLL があります。ソフト ページ フォールトがメモリ マップド ファイルの通常の副作用であることはわかっていますが、思ったよりも多く発生しています (タスク マネージャーの PF Delta 値が毎秒約 2000 と高い)。したがって、メモリマップファイルを作成し、それに書き込み、そこから読み取るコードの一部を投稿して、誰かが私のアプローチに欠陥があるかどうかを確認します。以下にコードの抜粋を示します。注、私は1MBの望ましいファイルサイズを使用しています:
// Uses pagefile.sys
procedure initFile(
theFilename: string;
theDesiredFilesize: integer;
out theViewHandle: THandle;
out theBaseAddressPtr: Pointer);
var
MaximumSizeLow, MaximumSizeHigh: Cardinal;
begin
I64ToCardinals(theDesiredFilesize, MaximumSizeLow, MaximumSizeHigh);
theViewHandle :=
CreateFileMapping(
INVALID_HANDLE_VALUE,
nil,
PAGE_READWRITE or SEC_COMMIT,
MaximumSizeHigh,
MaximumSizeLow,
PChar(theFilename));
if theViewHandle = 0 then
RaiseLastOSError;
theBaseAddressPtr := MapViewOfFile (theViewHandle, FILE_MAP_ALL_ACCESS, 0, 0, 0);
end;
procedure TShareMem.doSaveBuffer(const theSourceBufPtr: Pointer; numBytes: integer);
var
newSize: Int64;
begin
if not Assigned(theSourceBufPtr) then
raise Exception.Create('(doSaveBuffer) The source buffer pointer is unassigned.');
newSize := numBytes;
Move(theSourceBufPtr^, FDataBufferPtr^, newSize);
// Increment the write count.
Inc(FDataBufferHeader.writeCount);
// Update the variable that lets others know the actual size of the
// object/data we just stored.
FDataBufferHeader.sizeInUse := numBytes;
// Update the header file.
updateHeaderFile;
end;
procedure TShareMem.loadStream(theDestStream: TMemoryStream);
var
theSize: Int64;
begin
if not Assigned(theDestStream) then
raise Exception.Create('(loadStream) The destination stream is unassigned.');
updateHeader;
// Rewind the destination stream.
theDestStream.Position := 0;
theSize := FDataBufferHeader.sizeInUse;
theDestStream.Size := theSize;
// Read data from the memory mapped data buffer into the stream.
// theDestStream.WriteBuffer(FDataBufferPtr^, FDataBufferHeader.size);
Move(FDataBufferPtr^, theDestStream.Memory^, theSize);
end;