2

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;
4

0 に答える 0